【QT神奇Bug】中文乱码、括号乱码、冒号乱码【2023.03.22】

😍Qt乱码疑难杂症解决方案

Solved by Yang Naifen.

📺视频讲解地址:【Qt疑难杂症之乱码-哔哩哔哩】 https://b23.tv/83MmXru

附言:解决这个bug按照我当前的薪资,至少四百RMB。都是工农阶级的工友,有bug一起解

决,大家都少掉头发😃。如果帮到未来年薪百万的大佬,多给小弟个👍。


一、Know Why

1.大端、小端

大小端指的是数据在内存中存放的顺序。数据高低位与地址增长一致的叫小端,与地址增长相反的叫大端。通过下面的表格搞清楚内存地址高低指的是地址值的大小。整数字节序指的进制位的高低。记个绕口令:顺为小端,逆为大端。

2. BOM(Byte Order Mark)

当我们传输数据时,比如说网络传输,发送端和接收端都要指定”整齐划一“传输与解析标准。BOM的作用就在于此。通过该标记位可以确定文件中数据是大端还是小端加载到内存中。但是UTF-8文件是不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。EF BB BF开头的文件头可以明确指示该文件是UTF-8编码。下面的代码用于验证BOM前缀。

// 注意工程代码目录下存放有utf-8 BOM编码的文件main.file,用记事本新建一个即可
//
#include "stdafx.h"
#include <stdio.h>
#include <stdarg.h>
#include <memory.h>
#include <iostream>


typedef struct _Data
{
	char arr[20];
	int nvar;
} Data;

#define CHAR_SIZE 1280
int _tmain(int argc, _TCHAR* argv[])
{
	using namespace std;
	FILE *fp;
	if ((fp = fopen("main.file", "rb+")) != NULL)//"a"文本文件追加的方式写入  "w" 重新写
	{
		fseek(fp, 0, SEEK_END);
		long ret = ftell(fp);
		fseek(fp, 0, SEEK_SET);

		char ch[CHAR_SIZE] = { 0 };

		ret = fread(ch, 128, 1, fp);

		printf("%x", (unsigned char)ch[0]);
		printf("%x", (unsigned char)ch[1]);
		printf("%x", (unsigned char)ch[2]);
		printf("\n");

		for (int i = 3; i < CHAR_SIZE; i++)
		{
			printf("%c", ch[i]);
		}
		
		printf("\n");		
		fclose(fp);
	}

	char ch;
	cin >> ch;
	return 0;
}


3.与QtCreator开发工具的关系

因为QtCreator是跨平台的,所以比VisualStudio处理字符集编码要麻烦些。我们在QtCreator里写代码是写到文件里面,就会涉及到文件的编码,如果代码在文件中的编码标准是A,而编译时是按照编码标准B进行解析,则会出错。 Utf-8对应的是宽字符集编码,新代码开发基本都用该编码。QtCreator写代码一般默认的就是该编码方式。Windows平台下使用QtCreator有时候会遇到字符串输入中文乱码的情况,如果网上的现有方案都不起作用的话,可能是文件需要BOM前缀来明确告诉Qt编译器编码方式。也就是要把文件的编码固定为utf-8 BOM编码。

二、Know How

Qt Creator中遇到中文乱码实在解决不掉可以尝试下面的方法。

1.Qt配置

在这里插入图片描述

2.修改代码编码

使用Windows的记事本打开,另存为时选择Utf-8 BOM。

在这里插入图片描述

三、我是这么解决的,方案不唯一

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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 ``` 以上是一些可能有用的解决方案,希望能够帮助到你。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值