Linux下中文编码方式很好解决,统一用UTF-8
就没问题了,然而在Windows下这个简单的问题会有很多坑……为了在VS中让Qt正确显示中文,折腾了好久终于尝试出一个可用的方法,记录如下。
Linux和Qt内部都是使用UTF-8
处理字符的,故考虑到跨平台的需求,将源代码保存为UTF-8
格式兼容性最好。然而如果使用不带签名的UTF-8
格式(即Unicode(UTF-8 无签名) - 代码页 65001)保存的话,在程序中存在奇数个字符的中文字符串时,无法正常编译,此时会出现error C2001:常量中有换行符
。关于这个问题可参考:
结论就是不要使用无签名的UTF-8
编码源文件,无比的坑啊……另一篇文章中比较了各种编码格式的兼容性:
结论是使用带签名的UTF-8
格式(即Unicode(UTF-8 带签名) - 代码页 65001)是兼容性最好的选择。选择了这种编码方式后可以正常编译含有中文字符串的源文件了,不过要是不做任何设置的话,此时在Qt中显示出来的效果会是乱码。
为了正确显示中文,需要在使用到中文的源文件头部加上这样一句预编译指令:
1 |
这条预编译指令的作用是指定字符串的输出编码方式为UTF-8
,注意,这与文件本身的编码方式没有关系。详细说明可参考MSDN:
MSDN中还提到,这条指令已经要过时了,需要使用新方法来替代,不过目前还能使用,就不再折腾了……这条指令也是VS下特有的,GCC没有也不需要这个设置,故加上条件编译来保证跨平台移植的兼容性:
1 |
这样设置后,Qt中就可以正确显示中文了。需要注意的是,其实并没有必要使用QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"))
来指定Qt的编码方式,因为默认情况下使用的就是UTF-8
编码方式。