我们以“测试字符串-보고싶다-Test String.”
这个字符串来进行讲解,它包含了英文、中文和韩文。
因为我使用 Qt 的方式是Visual Studio + Qt库
的形式,所以本文以Visual Studio
的MSVC编译器
为例来进行讲解,但这种方式的原理也适用于其他编译器。
QString 中使用 QChar 来存储每一个字符,QChar 是 short 类型,占 2 个字节,默认按 Unicode 编码存储。
首先,为了保证写到代码文件中的测试字符串能被 MSVC 编译器理解,我们需要将源文件保存为Utf8-带签名
的格式。具体参考:拨开字符编码的迷雾(2)--编译器处理文件编码
解决Qt程序乱码问题的关键在于理解QString中存储字符的编码格式。
QString 中存储的字符串的编码格式就是“编译器执行字符集编码格式”。 这一句话很关键。
在 MSVC 中我们可以使用#pragma execution_character_set("utf-8")
来指定该源文件的执行字符集编码格式为 UTF8 格式,这样 QString 中存储的字符串格式就是 utf8 编码了。
下面是完整的测试用例:
1 | void Demo01::qStringUseCase() { |
QString::toLocal8Bit
QString 有一个名为toLocal8Bit
的方法,网上很多介绍如何解决乱码的文章都会提到这个函数。关于这个函数官方的介绍如下:
1 | Returns the local 8-bit representation of the string as a QByteArray. The returned byte array is undefined if the string contains characters not supported by the local 8-bit encoding. |
简单来说,我们可以理解为这个函数将字符串转换为的 ANSI 编码,通过拨开字符编码的迷雾(1)--字符编码概述介绍,我们应该知道ANSI
是和具体的代码页相关联的(在 Windows 中文环境下默认代码页为 936)。Qt 不是根据系统代码页来做判断的,而是通过QTextCodec
来做判断的,所以文档中会提到这个函数需要结合QTextCodec::codecForLocale()
来使用,toLocal8Bit
根据对应的QTextCodec
来做相应的转换。
总结
所以要想在使用 Qt 时,避免遇到中文乱码问题,只需要在预编译头文件中加入(对于不使用预编译头的项目可以在.cpp文件中添加):
1 |
同时由于部分韩文、日文等字符不在 Visual Studio 默认的中文 GB2312 编码中,所以如果遇到 Visual Studio 提示“此文件的某些 Unicode 字符未能保存到当前代码页中”时,这时应该选择”Utf8-带签名
“格式来保存。
综上所述,源文件保存为Utf8-带签名
,且设置#pragma execution_character_set("utf-8")
就可以解决所有乱码问题。
文章图片带有“CSDN”水印的说明:
由于该文章和图片最初发表在我的CSDN 博客中,因此图片被 CSDN 自动添加了水印。