这里用到的读取utf8文件的思路特别朴素.先把utf8文件按char读取到内存里.因为utf8是变长的,为了处理方便,在内存里把char转化成wchar_t,这样一个字符就是一个wchar_t.把utf8文件转成wchar_t的字符串之后,可以进行各种操作,比如统计非中文字符,对齐等.当然也包含要显示wchar_t.windows的命令行不能直接显示wchar_t字符,想显示必须再把wchar_t转成gbk或者utf8.

看C28ShowWchar.c的代码:

//utf-8编码
#include <stdio.h>
#include <windows.h>
char* unicode2Utf8(wchar_t* unicodeStr) {
int cStrLen = WideCharToMultiByte(CP_UTF8, 0, unicodeStr, -1, NULL, 0, NULL, NULL);
char* cStr = (char*)malloc(sizeof(char) * (cStrLen + 1));
WideCharToMultiByte(CP_UTF8, 0, unicodeStr, -1, cStr, cStrLen + 1, NULL, NULL);
*(cStr + cStrLen) = '\0';
return cStr;
} void main() {
wchar_t* unicodeStr = L"中国";
char* utf8Str = unicode2Utf8(unicodeStr);
printf("%s\n", utf8Str);
getchar();
}

打开VS的"开发人员命令提示符",执行下面命令把命令行的编码设置成utf8:

CHCP 65001

再把字体设置成"Lucida Console"

然后用下面命编译链接

cl C28ShowWchar.c /source-charset:utf-8

/source-charset:utf-8表示编码是utf8.再运行生成的可执行文件就能看到"中国"两个汉字.

再看源代码C29ShowWchar1.c

//utf-8编码
#include <stdio.h>
#include <windows.h>
char* unicode2gbk(wchar_t* unicodeStr) {
int cStrLen = WideCharToMultiByte(CP_ACP, 0, unicodeStr, -1, NULL, 0, NULL, NULL);
char* cStr = (char*)malloc(sizeof(char) * (cStrLen + 1));
WideCharToMultiByte(CP_ACP, 0, unicodeStr, -1, cStr, cStrLen + 1, NULL, NULL);
*(cStr + cStrLen) = '\0';
return cStr;
} void main() {
wchar_t* unicodeStr = L"中国";
char* gbkStr = unicode2gbk(unicodeStr);
printf("%s\n", gbkStr);
getchar();
}

CP_ACP表示windows默认的ANSI code page,对于简体中文就是gbk.按ctrl+F5就能看到"中国"两个汉字.

读取utf8文件的思路就是先按char把文件读到char类型的链表里.读完后把链表里的char放到一个char型的数组里.再把char型的数组转化成unicode.

源代码如下:

https://github.com/zhouyang209117/CppTutorial/blob/master/C/Win32Api/ch02/C22ReadUtf8File.c

参考资料

微软官方文档fopen_s, _wfopen_s

WideCharToMultiByte function

windows程序设计03_读取utf8文件的更多相关文章

  1. 解決BufferedReader读取UTF-8文件中文乱码

    解決BufferedReader读取UTF-8文件中文乱码         File rst01 = new File(context.getRealPath("/")+" ...

  2. python 读取utf8文件

    有时候默认是gbk编码,但是要读取utf8文件,所以会出现decode 错误. 使用codecs模块: import codecs file = codecs.open('filename','r', ...

  3. 解決BufferedReader读取UTF-8文件中文乱码(转)

    读取txt文件乱码 BufferedReader read = new BufferedReader(new FileReader(new File(filename))); 解决办法: InputS ...

  4. windows下读取utf-8文件

    #include <stdio.h> #include <tchar.h> #include <memory> int main() { FILE* fp1 = f ...

  5. c++ 读取 utf-8 文件到 string

    #include <iostream> #include <assert.h> #include <fstream> #include <string> ...

  6. Java读取Unicode文件(UTF-8等)时碰到的BOM首字符问题,及处理方法

    转载:https://blog.csdn.net/clementad/article/details/47168573 2015-18-01修改:增加 apache commons io 处理方法. ...

  7. Java读取Unicode文件(UTF-8等)时碰到的BOM首字符问题

    在Windows下用文本编辑器创建的文本文件,如果选择以UTF-8等Unicode格式保存,会在文件头(第一个字符)加入一个BOM标识.   这个标识在Java读取文件的时候,不会被去掉,而且Stri ...

  8. Java读取UTF-8格式文件第一行出现乱码——问号“?”及解决 And Java读带有BOM的UTF-8文件乱码原因及解决方法

    測试样例: Java读取UTF-8的txt文件第一行出现乱码"?"及解决 test.txt文件内容: 1 00:00:06,000 --> 00:00:06,010 < ...

  9. 读取xml文件报错:Invalid byte 2 of 2-byte UTF-8 sequence。

    程序读取xml文件后,系统报“Invalid byte 2 of 2-byte UTF-8 sequence”错误,如何解决呢? 1.程序解析xml的时候,出现Invalid byte 2 of 2- ...

随机推荐

  1. web开发基本概念

    一.什么是静态页面,什么是动态页面? 答:静态页面是不需要网络请求就可以看到的页面,保存在本地. 动态页面是需要网络请求才可以看到的页面,保存在服务器. 二.网页的运行环境? 答:浏览器 客户端 三. ...

  2. PHP 修改数组中的值

    PHP 修改数组中的值 ①.二维数组可以通过 for($i = 0; $i < count(Array()); ++ $i) 这种形式修改 实例代码: // 修改 二维数组中的 name为 Ge ...

  3. python:正则0

    Python3 正则表达式特殊符号及用法(详细列表) 正则表达式的强大之处在于特殊符号的应用,特殊符号定义了字符集合.子组匹配.模式重复次数.正是这些特殊符号使得一个正则表达式可以匹配字符串集合而不只 ...

  4. [转发]CSR8670的DFU功能

    本文源自:https://blog.csdn.net/wzz4420381/article/details/52371409 作者:RyomaWang 申明:为了保持原作者内容,这里不进行任何修改,后 ...

  5. Ubuntu 16.04上源码编译Poco并编写cmake文件 | guide to compile and install poco cpp library on ubuntu 16.04

    本文首发于个人博客https://kezunlin.me/post/281dd8cd/,欢迎阅读! guide to compile and install poco cpp library on u ...

  6. 【论文阅读】Binary Multi-View Clustering

    文章地址:https://ieeexplore.ieee.org/document/8387526 出自:IEEE Trans. on Pattern Analysis and Machine Int ...

  7. HTTPS 原理分析——带着疑问层层深入

    HTTPS 随着 HTTPS 建站的成本下降,现在大部分的网站都已经开始用上 HTTPS 协议.大家都知道 HTTPS 比 HTTP 安全,也听说过与 HTTPS 协议相关的概念有 SSL .非对称加 ...

  8. 基于 HTML5 + WebGL 的地铁 3D 可视化系统

    前言 工业互联网,物联网,可视化等名词在我们现在信息化的大背景下已经是耳熟能详,日常生活的交通,出行,吃穿等可能都可以用信息化的方式来为我们表达,在传统的可视化监控领域,一般都是基于 Web SCAD ...

  9. Java基础IO类之缓冲流

    首先要明确一个概念: 对文件或其他目标频繁的读写操作,效率低,性能差. 使用缓冲流的好处是:能够高效的读写信息,原理是先将数据先缓冲起来,然后一起写入或者读取出来. 对于字节: BufferedInp ...

  10. Slickflow.Graph 开源工作流引擎快速入门之四: 图形编码建模工具使用手册

    前言: 业务人员绘制流程时,通常使用图形GUI界面交互操作来完成,然而对于需要频繁操作或者管理较多流程的系统管理用户,就需要一款辅助工具,来帮助他们快速完成流程的创建和编辑更新.Slickflow.G ...