关于字符编码,做个学习记录

一、相关基本概念理解

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......();

猜你喜欢

转载自www.cnblogs.com/litie-study/p/12763051.html