Qt解决中文乱码问题(更新于2023.12.27)

前言

我在编写Qt程序的时候经常出现中文乱码的情况,我只遇到了三种情况,对这三种情况有不同的解决方式。

第一种情况——默认编码错误

这种情况是Qt的编码不正确,没有使用UTF-8,但是我觉得大多数人都不是这种,现在Qt在安装之后似乎默认就是UFT-8,若是这种情况,可以参考以下解决方案对默认编码进行一个修改:

  1. 在Qt上方工具栏中找到“工具”并单击在这里插入图片描述
  2. 选择“选项在这里插入图片描述
  3. 找到“文本编辑器”中的“行为在这里插入图片描述
  4. 将默认编码更改为UTF-8在这里插入图片描述
    在更改了编码之后,能解决因为编码无法解析汉字而导致的乱码问题。但是在大多数时候并不是这个情况,下面的情况更常见一点。

第二种情况——文字流编码错误(常见)

若是上面的方法还是不行,可能是使用了QTextStream读写了有中文内容的文本,但是它的编码却不是UTF-8,可以再试试以下方法,对其文本流指定编码:
在main函数中使用QTextCodec进行编码设置
注意需要包含头文件QTextCodec!!!,在进行更改前源代码是这样:

int main(int argc,char *argv[]){
    QApplication a(argc,argv);
    MainWindow w;
    w.show();
    return a.exec();
}

在main函数中添加两行内容,用于指定文字流编码

#include <QTextCodec>

QTextCodec *codec = QTextCodec::codecForName("UTF-8");
QTextCodec::setCodecForLocale(codec);

更改完后变为:

int main(int argc,char *argv[]){
    //更改编码
    QTextCodec *codec = QTextCodec::codecForName("UTF-8");
    QTextCodec::setCodecForLocale(codec);

    QApplication a(argc,argv);
    MainWindow w;
    w.show();
    return a.exec();
}

这样应该就不会出错了。这种是最常见的情况,大多数人在进行修改后就能正常运行程序了
有读者反馈说此方法无用,经查询这是Qt版本导致的,QTextCodec在Qt5、6中已经不再使用,Qt6中则是完全将其弃用,但是由于作者的Qt版本没这么高级,因此对于高版本Qt此种中文乱码问题我也不知道有什么解决办法

第三种情况——没使用QString存储文字

在编写Qt项目的时候没有使用QString,而是使用的string或者其他的类型储存文字。
这个比较简单,将对象类型进行一个修改即可。

最后

这只是我遇到的三种,应该是还存在其他问题的,若是还遇到了别的情况可以将自己遇到的问题打在评论区或者私聊我,我看到了就会去试验,有了结果之后再对文章内容进行一个更新。

Qt 中,如果你在使用串口通信时出现了中文乱码问题,可能是因为你没有正确地设置串口的编码格式。下面是一些可能有用的解决方案: 1. 设置串口的编码格式为 UTF-8。 ```cpp QSerialPort serial; serial.setBaudRate(QSerialPort::Baud9600); serial.setDataBits(QSerialPort::Data8); serial.setParity(QSerialPort::NoParity); serial.setStopBits(QSerialPort::OneStop); serial.setFlowControl(QSerialPort::NoFlowControl); serial.setTextModeEnabled(true); // 设置为文本模式 serial.setLocalEchoEnabled(true); // 开启本地回显 serial.setCodec("UTF-8"); // 设置编码格式为 UTF-8 ``` 2. 使用 QTextCodec 对串口数据进行编码/解码。 ```cpp QSerialPort serial; serial.setBaudRate(QSerialPort::Baud9600); serial.setDataBits(QSerialPort::Data8); serial.setParity(QSerialPort::NoParity); serial.setStopBits(QSerialPort::OneStop); serial.setFlowControl(QSerialPort::NoFlowControl); QTextCodec *codec = QTextCodec::codecForName("GB18030"); // 设置编码格式为 GB18030 serial.write(codec->fromUnicode(QString("你好"))); // 将字符串 "你好" 转换为 GB18030 编码的字节流并发送 QByteArray data = serial.readAll(); QString str = codec->toUnicode(data); // 将接收到的字节流解码为字符串 ``` 3. 在接收到数据后手动将字节流转换为 QString。 ```cpp QSerialPort serial; serial.setBaudRate(QSerialPort::Baud9600); serial.setDataBits(QSerialPort::Data8); serial.setParity(QSerialPort::NoParity); serial.setStopBits(QSerialPort::OneStop); serial.setFlowControl(QSerialPort::NoFlowControl); serial.write("hello"); // 发送字符串 "hello" QByteArray data = serial.readAll(); QString str = QString::fromUtf8(data); // 将接收到的字节流转换为 QString ``` 以上是一些可能有用的解决方案,希望能够帮助到你。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

默示MoS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值