一、相关基本概念理解
1、字符编码:Unicode,utf-8,utf-16等是不同的字符编码方式,其二进制的位数不同。为了达到节省空间,解析方便等目的,出现了多种存储字符编码的方式,每种方式对应一套算法就是字符编码。
2、编码字符集(字符集):就是一种字符编码方式下的所有编码与字符映射集合。例如:在ASCII码的编码字符集中,每个字母对应一个二进制数。
3、源文件字符集:源文件本身也是文本文件,所以源文件字符集是指源文件保存时采用哪种字符编码。
4、执行字符集:可执行应用程序内使用何种字符编码。编译器会将源码字符集转换为执行字符集。
5、BOM(Byte Order Mark),字节顺序标记,出现在文本文件头部,Unicode编码标准中用于标识文件是采用哪种格式的编码。Windows 就是使用 BOM 来标记文本文件的编码方式的。
6、编译器对字符的处理:
编译程序的时候,会分析源文件采用何种编码,有BOM标识符则可以正确识别其编码,若没有BOM标识符则认为其使用本地字符编码local字符集,
windows系统本地字符编码为GBK编码。编译器分析出源文件字符编码之后,会进行解码再编码,将源字符集转码成执行字符集。执行字符集一般默认为使用本地字符编码local字符集,也可以进行设置。
二、QString显示中文乱码的原因:
Qt5中QString内部采用unicode字符集,utf-16编码。构造函数QString::QString(const char *str)默认使用fromUtf8()将str所指的执行字符集从utf-8转码成utf-16。
QString需要执行字符集编码为utf-8,然后以utf-8进行解码,再编码为utf-16才能获得正确的字符编码。
显示中文乱码的原因其实就QString转码方式与执行字符集不一致。比如,源字符集为本地字符集GBK编码,QString以utf-8的方式进行解码,会导致获得错误的二进制编码,再将错误二进制转为utf-16就会出现乱码。
三、解决方法
1、源文件设置BOM标识的utf-8编码,执行字符集为设置为utf-8。这样源字符集,执行字符集都是一致,编译不进行转换,QString内部直接用utf8读取没问题。
2、就是确认源码到执行字符集是否转换,按执行字符集使用QString::froml......();
原文:https://www.cnblogs.com/litie-study/p/12763051.html