一、MSVC编译器输出中文的问题
例如,程序运行时,该Qstring数组中的中文会出现乱码。
Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); ColumnNames[0] = "HUIYuan"; ColumnNames[1] = QStringLiteral("姓名"); ColumnNames[2] = "年龄"; }
因为Qt Creator保存的文件使用的是UTF-8编码(是任何平台、任何语言都可以使用的跨平台的字符集),MSVC编译器虽然可以正常编译带BOM的UTF-8编码的源文件,但是生成的可执行文件的编码是 Windows 本地字符集,比如 GBK2312。而Qt 自带的MinGW一般不会出现乱码问题。
也就是在可执行文件中,字符串“年龄”是以GBK2312编码的,而可执行程序执行到这条语句时,对这个字符串却是以UTF-8解码的,这样就会出现乱码。
二、解决方案
1、QStringLiteral()宏或者QString::fromLocal8Bit()封装字符串
程序中需要使用QStringLiteral()宏对每个中文字符串进行封装,但不能再使用tr()函数用于翻译了。
缺陷:需要对每个含有中文的字符串进行封装,而且tr()函数无法使用(无国际化翻译需求可忽略)。
2、强制 MSVC 编译器生成的可执行文件使用UTF-8编码
需要在每个使用到中文字符串的头文件和源程序文件的前部加入如下的语句
#if _MSC_VER >= 1600 //VS2015>VS>VS2010, MSVC VER= 10.0 -14.0 #pragma execution_character_set("utf-8") #endif
VS2015以后的使用如下方案
在pro文件中添加
win32:msvc{ QMAKE_CXXFLAGS += /source-charset:utf-8 /execution-charset:utf-8 }