c++读取utf8等不同编码文件
2013-09-18 22:51
1201 查看
我们经常会遇到文件打开乱码的情况,特别是用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,"");
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,"");
相关文章推荐
- C++ 保存文件为UTF8编码格式
- FileReader读取文件,由于不确定源文件的编码格式不同,导致读出的文件乱码的问题
- ubuntu下读取 不同编码格式的文件 读取中文
- (好文!!)FileReader读取文件,由于不确定源文件的编码格式不同,导致读出的文件乱码的问题
- FileReader读取文件,由于不确定源文件的编码格式不同,导致读出的文件乱码的问题
- (好文!!)FileReader读取文件,由于不确定源文件的编码格式不同,导致读出的文件乱码的问题
- Python读取文件,检测文件编码及去除UTF8 BOM
- Java读取不同编码格式的文件
- VBA写txt文件--vba写RF文件--vbs写文本文件不同编码--vba写UTF8
- CTextFileIO读取不同编码文件
- JAVA读取不同编码的txt文件,java获取txt文件编码格式
- java BufferedReader 读取不同编码类型的网页,文件
- python读取不同文件的编码问题
- 读取和写入不同编码格式的文件
- 疑问:Perl读取UTF8编码的文件,显示乱码。
- JAVA读取不同编码格式的TXT文件
- [libexpat]_[XML处理]_[C/C++使用libexpat库以数据流(SAX模型)的方式读取(解析)大XML文件]
- c++ std::ifstream 读取文件不完整? 是不是忘记了ios_base::binary
- 如何使用opencv的c++接口来读取、写结构体数组到xml文件中
- 读取文件,到标准输入流(c语言 和 c++版)