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其实有CreateFileA和CreateFileW两个版本,这个设置的主要是让编译器自动选择不同的函数,跟把我们字符串编译进内存里面没什么关系
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的数值