这里用到的读取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. idea 常用功能

      Ctrl + E:打开最近文件   双击 Shift:按文件名查找文件   Ctrl + Shift + F:全局搜索   Alt + ~(数字 1 左边的键):commit.push 代码   ...

  2. nyoj 28-大数阶乘 (大数模板)

    28-大数阶乘 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:19 submit:39 题目描述: 我们都知道如何计算一个数的阶乘,可是,如果这个数 ...

  3. JavaScript返回格式化的时间字符串

    http://www.w3school.com.cn/jsref/jsref_getMinutes.asp 由 getMinutes() 返回的值是一个两位的数字.不过返回值不总是两位的,如果该值小于 ...

  4. 更改input标签的placeholder的样式

    主要是要区别不同浏览器的不同css类 在input框中有时想将输入的字和placeholder设为不同的颜色或其它效果,这时就可以用以下代码来对placeholder进行样式设置了. input::- ...

  5. zip的压缩和解压命令

    以下命令均在/home目录下操作cd /home #进入/home目录 1.把/home目录下面的data目录压缩为data.zip zip -r data.zip data #压缩data目录   ...

  6. 关于虚拟机克隆之后IP重新设置

    由于要搭建一套环境,本来搭建好的后来搞崩了,因为之前的虚拟机没有克隆过以及创建快照,所以今天就重新创建一套环境创建虚拟机快照,以及要解决克隆之后的IP重新设置问题. 1.查看本机orcl IP:[ro ...

  7. Vue 指令总结大全

    1.v-text v-text主要用来更新textContent. <p>{{msg}}</p>与<p v-text="msg2"></p ...

  8. sqlserver2008 R2 安装以后没有 sql server profiler

    一些人在安装好SQL server 2008 r2或者从empress升级到enterprise或者开发版之后没有SQL server profiler功能,如果需要加装则应该找到自己的安装文件(部分 ...

  9. tensorflow:模型的保存和训练过程可视化

    在使用tf来训练模型的时候,难免会出现中断的情况.这时候自然就希望能够将辛辛苦苦得到的中间参数保留下来,不然下次又要重新开始. 保存模型的方法: #之前是各种构建模型graph的操作(矩阵相乘,sig ...

  10. Altium Designer 18 画keepout层与将keepout层转换成Mechanical1层的方法

    画keepout的方法 先选中Keepout层:然后 右键->Place->Keepout->然后选择要画圆还是线 Keepout层一般只用来辅助Layout,不能作为PCB的外形结 ...