c++读取utf8等不同编码文件

来源:互联网 发布:驾校预约软件 编辑:程序博客网 时间:2024/05/16 06:06

我们经常会遇到文件打开乱码的情况,特别是用C语言操作文件的时候。我用notepad++打开发现是utf8编码的,后来上网查了一下,UTF-8是变长的,一般情况下文件开头有个BOM(Byte Order Mark)作为标识,一般文本编码的BOM:

ANSI:没有BOM,直接是内容。

UNICODE(LE):FF FE
UNICODE(BE):FE FF
UTF-8:EF BB BF

【注】还有一种无BOM的UTF-8编码,这里不考虑。


ANSI采取的是英文字符一个字节,汉字字符两个字节的编码方式,而UNICODE采取使用0-0x10FFFF的数字来映射所有字符,被称为万国码,这里的UNICODE(LE),UNICODE(BE),UTF-8都是UNICODE的子集,其中UNICODE(LE),UNICODE(BE)采用固定两个字节长度的编码,UTF-8采用1到4个字节的变长字节的编码。

LE,BE分别指Little Endian,Big Endian。BIG-ENDIAN就是低位字节排放在内存的高端,高位字节排放在内存的低端。而LITTLE-ENDIAN正好相反。

【举个栗子】现在要编码数字1,我们知道1的4字节编码是0x00000001

采用BE编码,四个字节分别是0x01,0x00,0x00,0x00

采用LE编码,四个字节分别是0x00,0x00,0x00,0x01

【注】CPU读取内存从低地址到高地址


读取文本文件之前先判断BOM,然后分别用不同的方法进行读取,本文说明的是C语言操作方法。

打开这几种的字符方法基本相同,ANSI和UNICODE都可以用fopen(const char* fname,const char* mode)打开,如果有中文再进行格式的转换即可,UTF-8需要用_wfopen(L"utf8.txt", L"r,ccs=utf-8")打开,当然了,这个方法也能打开前面两种编码,只要指定编码格式(ccs=<encoding>)即可。


【注】有时读取的字符串不能正常显示,须在读取之前指定地区,setlocal(LC_ALL,"");

原创粉丝点击