Qt库作为一个开源库,并且支持多语言。在开发时需要考虑字符编码问题。
我现在的使用Qt开发环境为VS2012+Qt5.1.1,所以一下所讨论的也是基于这个版本而言的。目前Qt5已经将 tr() 删掉了。

在windows下使用Qt库进行开发
有两种主流开发环境:

  1. 使用Qt Creator作为开发环境
  2. 使用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"字符串";