Qt中出现中文乱码的原因以及解决方法

本文分析了Qt编程中遇到中文乱码的原因,包括源文件编码、程序默认编码和QString加载方式,并提供了修改编码格式的方法,如QTextCodec和预处理器指令。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Qt专栏:http://t.csdnimg.cn/C2SDN

目录

1.引言

2.原因分析

3.源文件的编码格式修改方法

4.程序内部使用的默认编码格式修改方法

5.QString转std::string的方法

6.总结


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加载中文,在默认的内部字符编码环境中都不会出现乱码。

Qt6之QStringLitertal源码分析_qstring源码分析-CSDN博客

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编程的过程中,出现过中文乱码的情况吗?欢迎留言讨论。

参考:

/utf-8(将源字符集和执行字符集设置为 UTF-8) | Microsoft Learn

### QT框架中出现乱码问题的解决方案 在QT框架中,中文乱码问题通常与编码设置、编译器环境以及字符串处理方式相关。以下是几种常见的解决方法及其具体实现: #### 1. 设置执行字符集为UTF-8 确保程序的执行字符集为UTF-8,可以通过以下代码实现: ```cpp #if defined(_MSC_VER) && (_MSC_VER >= 1600) # pragma execution_character_set("utf-8") #endif ``` 此代码需要添加到头文件中,以确保所有字符串默认使用UTF-8编码[^1]。 #### 2. 使用`QStringLiteral`宏封装中文字符串 对于每个包含中文的字符串,可以使用`QStringLiteral`宏进行封装,从而避免转码问题。例如: ```cpp // QString str = "你好:"; // 可能导致乱码 QString str = QStringLiteral("你好:"); // 不会乱码 ui->label->setText(str); ``` 这种方法适用于直接在代码中定义的字符串[^1]。 #### 3. 显式指定字体 如果某些控件显示中文时仍然出现乱码,可能是由于系统缺省字体不支持中文。可以通过显式设置字体来解决: ```cpp QLabel *label = new QLabel("你好"); label->setFont(QFont("Microsoft YaHei")); // Windows 平台 // 或者跨平台字体: // label->setFont(QFont("PingFang SC")); // macOS // label->setFont(QFont("WenQuanYi Micro Hei")); // Linux ``` 此外,还需要检查系统是否已安装中文字体[^3]。 #### 4. 确保源文件保存为UTF-8编码(带BOM) 如果源文件未正确保存为UTF-8编码(带BOM),可能导致编译器无法正确识别编码。建议在保存文件时选择“UTF-8 with BOM”选项[^3]。 #### 5. 检查编译器和运行时环境的编码一致性 MSVC编译器生成的可执行文件可能使用Windows本地字符集(如GBK),而Qt Creator默认使用UTF-8编码。这种不一致可能导致乱码解决方法包括: - 在Qt Creator中设置文本编辑器的行为,确保其使用UTF-8编码。 - 确保编译器和运行时环境的编码一致[^5]。 #### 6. 验证字节序列 通过调试工具验证字符串的字节序列是否正确。例如: ```cpp qDebug() << QString("你好").toUtf8().toHex(); // 正确输出应为 "e4bda0e5a5bd" ``` 如果输出不符合预期,则说明编码存在问题[^3]。 #### 7. 控制台输出乱码解决方案 如果仅在控制台输出时出现乱码,可能是终端编码不匹配。可以在Windows下使用MSYS2或其他支持UTF-8的终端工具,并设置终端编码为UTF-8[^3]。 --- ###
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值