目录
1.引言
在编写Qt程序的时候,或多或少都可能遇到用QString时候,明明自己写的是中文,但是在界面上显示出来却是乱码,最终的原因都是加载字符串的方式和程序中内部字符默认的编码方式不匹配造成的。下面就这个原因仔细分析分析。
2.原因分析
默认情况下,QtCreator内部的字符编码方式是utf-8,vs(如VS2019)内部的字符编码方式是gbk。windows上一般是gbk,其他平台一般utf-8。
源代码的文件格式,在QtCreator添加的文件(.h、.cpp等)默认都是utf-8编码,在vs中添加的文件(.h、.cpp等)默认都是GB2312编码。文件格式可以通过EditPlus、Notepad++或其它工具查看,下面是Notepad++查看到的文件编码方式:
当然也可以修改文件的编码格式。
Qt界面内容显示都是通过QString来传值的,QString内部使用的Unicode编码,特别是有中文时,一般使用QString::fromLocal8Bit来加载中文,如:
QString text = QString::fromLocal8Bit("设备属性");
关于QString::fromLocal8Bit的讲解,可以查看我的另外一篇博客:
QString的toStdString、toLocal8bit和toLatin区别_tolocal8bit tolatin1 tostdstring-CSDN博客
通过上述分析,出现乱码来自三方面的原因:
1) 源文件的编码格式
2) 程序(QtCreator、VS2019等)内部使用的默认编码格式
3) QString加载中文的方式
在Qt程序中用QString::fromLocal8Bit或QStringLiteral加载中文,在默认的内部字符编码环境中都不会出现乱码。
3.源文件的编码格式修改方法
上面讲了源文件的编码格式可以通过EditPlus、Notepad++等工具修改,还可以通过VS来修改,步骤如下:
第一步:
第二步:
OK。
4.程序内部使用的默认编码格式修改方法
方法1:使用QTextCodec
#include "MainWindow.h"
#include <QApplication>
#include <QTextCodec>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//设置内部编码方式
QTextCodec* codec = QTextCodec::codecForName("GB2312");
QTextCodec::setCodecForLocale(codec);
MainWindow w;
w.show();
return a.exec();
}
方法2:在源码开头添加 #pragma execution_character_set("utf-8")
如下示例:
用预处理命令 #pragma execution_character_set("utf-8")将cpp编码设置为utf-8。
方法3:如果在Visual Studio中,直接可以使用 /utf-8 选项将源字符集和执行字符集指定为使用 UTF-8 编码的字符集。 它等效于在命令行上指定 /source-charset:utf-8 /execution-charset:utf-8。
设置步骤如下:
1)打开项目“属性页” 对话框。 有关详细信息,请参阅在 Visual Studio 中设置 C++ 编译器和生成属性。
2)选择“配置属性”>“C/C++”>“命令行”属性页。
3)在“附加选项”中,添加 /utf-8 选项以指定首选编码。
4)选择“确定”以保存更改 。
如下图所示:
5.QString转std::string的方法
直接用QString的toStdString就有可能出现中文乱码。
QString转std::string乱码通常是由于编码不一致导致的。Qt默认使用的编码可能是UTF-8,而std::string可能默认使用的是系统的本地编码,如GBK。
一般使用QString::toLocal8Bit()先将QString转为QByteArray,然后使用std::string的构造函数转为std::string。代码如下:
QString qStr = QString::fromUtf8("你好,世界");
std::string str = qStr.toLocal8Bit().constData();
6.总结
你们在使用Qt编程的过程中,出现过中文乱码的情况吗?欢迎留言讨论。
参考: