QT显示中文的几个问题

最近用QT,需要在界面上显示中文,发现QT无法直接在代码中写中文,只能通过曲线救国的方式,比如用QT语言家,QTextCodec的fromloca8bit

研究了半天,终于明白了一些编码的问题

 

 

1.VS的编码保存到内存中是以何种编码保存到内存里面的

这个是根据VS的文件->高级保存选项里面的编码来决定的

 

比如"空间打开"这四个字,在下面的几种编码,

 

UNICODE UTF-8 BIG ENDIAN

UNICODE

UNICODE UTF-8 带签名

 

以上都是以GBK的编码编译进内存里面,比如下面的代码

const char *h = ("空间打开");

我们查看h内存地址的内容,会发现十六进制是bf d5 bc e4 b4 f2 bf aa,查看GBK的编码,发现这段十六进制就是这四个字的GBK编码

 

UNICODE UTF-8无签名则是以UTF-8存储进去,上面这四个字则是e7 a9 ba e9 97 b4 e6 89 93 e5 bc 80,查询后发现这个是UTF-8编码

 

 

为什么UTF-8无签名可以让QT正确显示,但是UNICODE以及UNICODE BIG-endian 以及UNICODE 带签名和UTF-7不能让QT正确显示,这个涉及到QString的默认处理方式,查看3

 

2.文件保存的编码以及属性页里面的字符集设置有什么区别

 

属性页里面的字符集设置是定义一个宏,比如UNICODE来调用不同的函数,比如CreateFile其实有CreateFileACreateFileW两个版本,这个设置的主要是让编译器自动选择不同的函数,跟把我们字符串编译进内存里面没什么关系

 

 

3.QT默认QString是以何种编码的

我们查看QString的代码,从QString的构造函数查看下去,发现构造函数调用这么一行代码

QString s = fromUtf8(str, size);

也就是说,QString默认是把所有的输入字符串都看成UTF-8的输入,fromUtf8会把 UTF-8的字符串转换成Unicode

 

4.为什么UNICODE UTF-8无签名会无法编译过去 比如三个的中文"文件名"

这个暂时没找到问题

 

4.QT create中为什么中文是"数字"这种

这个是直接把中文的UTF-8编码转换成八进制,这个经过QString的处理后,就可以正确显示成UNICODE了,如果把对应的八进制转换成十六进制,然后再查询UTF-8的编码表,会发现对应的十六进制就是UTF-8的数值

原文地址:https://www.cnblogs.com/linyilong3/p/4868697.html