关于Qt中使用中文编码的一些问题
Qt库作为一个开源库,并且支持多语言。在开发时需要考虑字符编码问题。
我现在的使用Qt开发环境为VS2012+Qt5.1.1,所以一下所讨论的也是基于这个版本而言的。目前Qt5已经将 tr()
删掉了。
在windows下使用Qt库进行开发
有两种主流开发环境:
- 使用Qt Creator作为开发环境
- 使用Visual Studio + Visual Assist + Qt Visual Studio Addon作为开发环境
目前我使用的就是第二种开发环境,鉴于在Windows平台下没有哪个开发环境能与Visual Studio相媲美。
使用VS开发Qt程序时需要注意源文件的编码格式
Qt5官方推荐的源文件编码格式为UTF-8,QString内部的编码格式就是UTF-8,使用QtCreator创建的源文件的编码格式也是UTF-8 without BOM。
但是VS在中文操作系统上,如果不进行特殊的设置,默认创建的含有中文的源文件编码格式为gb3212。这样的原始字符串就是gb2312格式的,在使用时需要进行特殊转换,这样显示在界面上才不会乱码。
推荐使用一下两种方法解决gb2312编码问题:
-
QString::fromLocale8Bit()
会将gb2312编码的字符串转换为UTF-8格式以便存放在QString中。
-
QStringLiteral()
是一个宏定义,会在编译期将字符串实例化,对静态字符串使用这个字符串也是一个提高效率的方法(因为减少了运行时的内存申请开销)。
在VS中使用utf-8 with BOM的源文件格式
如果使用了utf-8 with BOM的源文件格式,VS会将其中的字符串转换为gb2312编码的中文,这样是为了兼容旧版本的编译器。
可以使用编译选项让VS编译器不进行这项转换,这样就可以直接使用字符串 char*
初始化QString了。
- 微软在VS2010中提供了
#pragma execution_character_set("utf-8")
这样的编译选项,能够防止编译器进行文件编码转换,保证字符串保留utf-8格式。
- VS2012 并不支持以上编译选项,VS2012将这个特性取消了
- VS2015 可以使用
/utf-8
让编译器能够识别 utf-8 without BOM格式的文件,并保留utf-8的字符串编码。
C++11的编码格式支持
对于支持C++11标准的编译器,可以采用如下的写法产生utf-8格式的字符串。
const char* szMsg = u8"字符串";