需求是
1.跨平台
2.QT开发
3.不考虑海外发行的翻译问题。
在这样的背景下,我决定把中文直接写在代码里算了,本来是用key-value方式存在一个文本文件里进行读取,然后生成一个map存在内存里,这么做不会有编码问题,但是写起来比较麻烦,每次加文字都需要加key。
因为要跨平台,那就不能使用Ansi编码,不然的话中文在MAC下会直接显示为乱码的,因为用VS写中文是GB2312编码的,在MAC下读不出来。
然后把文件格式修改为UTF8,这里需要在VS里把高级保存选项给调出来,设置方式可以参考这个
vs2017显示高级保存选项-百度经验jingyan.baidu.com改为UTF8之后,在MAC下就没有问题了。。然后发现在windows下竟然出问题了,中文会显示乱码,经过仔细研究,发现需要用UTF8 WITH BOM (就是选项里的UTF8 带签名),这样就没问题了。
因为UTF8不带签名 和ANSI一样的,估计vs把文件当做ANSI来处理了,结果导致乱码。
存为UTF8带签名格式则文件开头有标志,该是能够识别出是UTF8格式
无签名格式的读取结果
有签名格式的读取结果
代码是:
int main()
{
std::cout << "Hello World!n";
FILE* f = fopen("F:workwuji-clientWuYunmodulesgameWaitAni.cpp", "r");
unsigned char szTmp[1024] = {0};
fread(szTmp, 1024, 1, f);
fclose(f);
}
发现带签名格式只是在最前面多了EF BB BF 三字节
以上是我自己的研究
网上有一些文章可以参考
「带 BOM 的 UTF-8」和「无 BOM 的 UTF-8」有什么区别?网页代码一般使用哪个?www.zhihu.com