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的数值
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
2010-10-11 变序性算法
2010-10-11 移除性算法