前言

今天在使用QT开发代码的时候,发现设计到中文的部分会出现乱码的情况,查看了编译选项发现当使用 使用MSVC编译器 时,会出现乱码,使用MinGw时却没有出现乱码,这样就可以确定只有 MSVC编译器会导致这种情况发生。
核心原因呢,是因为编码问题,即UTF-8和GBK编码。

什么原因?

这是因为Qt Creator保存的文件使用的是UTF-8编码(是任何平台、任何语言都可以使用的跨平台的字符集),MSVC编译器虽然可以正常编译带BOM的UTF-8编码的源文件,但是生成的可执行文件的编码是 Windows 本地字符集,比如 GBK2312。
也就是在可执行文件中,字符串“测试”是以GBK2312编码的,而可执行程序执行到这条语句时,对这个字符串却是以UTF-8解码的,这样就会出现乱码。

解决方案

  • 方案一 使用QString 方法函数实现
    是使用 QStringLiteral()宏或者QString::fromLocal8Bit()封装字符串
    QStringLiteral(str)宏在编译时将一个字符串 str 生成字符串数据,并且存储在编译后文件的只读数据段中,程序运行时使用到此字符串时,只需读出此字符串数据即可。
    所以程序中需要使用QStringLiteral()宏对每个中文字符串进行封装,代码可改为:
QString str = QStringLiteral("测试");
QString str = QString::fromLocal8Bit("测试");

缺陷:
需要对每个含有中文的字符串进行封装,而且tr()函数无法使用(无国际化翻译需求可忽略).

  • 方案二
    强制 MSVC 编译器采用 UTF-8 编码生成可执行文件,需要在每个使用到中文字符串的头文件和源程序文件的前部加入如下的语句.
#if _MSC_VER >= 1600 //VS2015>VS>VS2010, MSVC VER= 10.0 -14.0
#pragma execution_character_set("utf-8")
#endif

缺陷:
每个有中文的文件都需要添加这个代码。

  • 方案三
    在pro文件中添加,声明代码块
msvc{
QMAKE_CFLAGS += /utf-8
QMAKE_CXXFLAGS += /utf-8
}

或者

msvc{
QMAKE_CXXFLAGS += /source-charset:utf-8 /execution-charset:utf-8
}

注意:msvc必须是小写,亲测大写MSVC无效。另外,运行之前,建议清除一下,重新构建,删除之前的缓存