VS2015 & Qt中文编码方式

Linux下中文编码方式很好解决,统一用UTF-8就没问题了,然而在Windows下这个简单的问题会有很多坑……为了在VS中让Qt正确显示中文,折腾了好久终于尝试出一个可用的方法,记录如下。

Linux和Qt内部都是使用UTF-8处理字符的,故考虑到跨平台的需求,将源代码保存为UTF-8格式兼容性最好。然而如果使用不带签名的UTF-8格式(即Unicode(UTF-8 无签名) - 代码页 65001)保存的话,在程序中存在奇数个字符的中文字符串时,无法正常编译,此时会出现error C2001:常量中有换行符。关于这个问题可参考:

Visual Studio error C2001:常量中有换行符(解决办法)

结论就是不要使用无签名的UTF-8编码源文件,无比的坑啊……另一篇文章中比较了各种编码格式的兼容性:

[C/C++] 各种C/C++编译器对UTF-8源码文件的兼容性测试(VC、GCC、BCB)

结论是使用带签名的UTF-8格式(即Unicode(UTF-8 带签名) - 代码页 65001)是兼容性最好的选择。选择了这种编码方式后可以正常编译含有中文字符串的源文件了,不过要是不做任何设置的话,此时在Qt中显示出来的效果会是乱码。

为了正确显示中文,需要在使用到中文的源文件头部加上这样一句预编译指令:

1
#pragma execution_character_set("utf-8")

这条预编译指令的作用是指定字符串的输出编码方式为UTF-8,注意,这与文件本身的编码方式没有关系。详细说明可参考MSDN:

execution_character_set

MSDN中还提到,这条指令已经要过时了,需要使用新方法来替代,不过目前还能使用,就不再折腾了……这条指令也是VS下特有的,GCC没有也不需要这个设置,故加上条件编译来保证跨平台移植的兼容性:

1
2
3
#ifdef  _MSC_VER
#pragma execution_character_set("utf-8")
#endif

这样设置后,Qt中就可以正确显示中文了。需要注意的是,其实并没有必要使用QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"))来指定Qt的编码方式,因为默认情况下使用的就是UTF-8编码方式。