在Windows上utf-8的编码都默认添加BOM头,但是也可以使用无BOM头的UTF-8来保存的,而在mac上默认的UTF-8都是无BOM的编码格式,所以代码中就会将无BOM的UTF-8判断成GBK来进行编码,所以会乱码。
记事本打开txt文件,然后另存,有四种编码格式可供选择,编码方式和判断方法:
ANSI | 无格式定义 | 对于中文编码格式是GB2312 |
Unicode | 文本里前两个字节为FF FE | 字节流是little endian |
Unicode big endian | 文本里前两个字节为FE FF | 字节流是big endian |
UTF-8 | 前两字节为EF BB,第三字节为BF | 带bom |
#include <fstream>
using namespace std;
int main()
{
ifstream fin("read.cpp",ios::binary);
unsigned char s2;
fin.read((char*)&s2, sizeof(s2));//读取第一个字节,然后左移8位
int p = s2<<8;
fin.read((char*)&s2, sizeof(s2));//读取第二个字节
p +=s2;
string code;
switch(p)//判断文本前两个字节
{
case 0xfffe: //65534
code = "Unicode";
break;
case 0xfeff://65279
code = "Unicode big endian";
break;
case 0xefbb://61371
code = "UTF-8";
break;
default:
code = "ANSI";
}
fin.close();
cout<< code << endl;
return 0;
}