😍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。