Qt常见问题(二) --- Qt中文乱码以及汉字编码

一、背景介绍
1.Unicode是一个编码方案
Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
2.Unicode三种实现方式

  1. utf8 占用一到四个字节,英文一个字节,中文三个字节
  2. utf-16占用二或四个字节
  3. utf-32占用四个字节

二、Qt 字符显示异常
在Qt creator中,我们书写的代码文件被强制转换为 utf8,在简体中文版的 Windows 操作系统中,默认编码却是 GBK
在这里插入图片描述在这里插入图片描述
当使用Visual C++编译程序的时候,它会分析源文件采用何种编码,有BOM标识符则可以正确识别其编码是UTF-8,若没有BOM标识符则认为其使用本地字符集编码(Local字符集)。综述,源文件是utf8编码,vc编译器认为源文件是利用本地字符集进行编码的,当检测到特殊字符的时候,自然会报“常量中具有换行符”。

三、解决方案
1.通常情况下设置源文件代码为utf8-bom格式,这样vs编译器才会用utf8编码集来解释
2.最常见的是利用QString::fromLocal8Bit完成对字符串本地字符集到Unicode字符集的转换。
在这里插入图片描述
第一个“你好”为啥输出异常,因为源代码是以utf8-bom形式保存的,vs编译器是利用gbk字符集去编译的文件。此时的第一个“你好”是gbk字符集中的编码,qt只认unicode编码,自然输出异常。
第二个“你好”已经完成了gbk字符编码到unicode编码的转换,输出自然正常。

如果已经设置了# pragma execution_character_set(“utf-8”),即修改vs编译器的执行字符集。
在这里插入图片描述
在这里插入图片描述
此时的第一个“你好”已经是utf8字符集中的编码,而第二个“你好”通过QString::fromLocal8Bit将已经是utf8字符集中的编码作为gbk字符集中的编码再去进行转换, 结果必定是在unicode中指向其他的字符。

发布了37 篇原创文章 · 获赞 1 · 访问量 4773

猜你喜欢

转载自blog.csdn.net/u010906468/article/details/105165464