(转)VS2015 & Qt中文编码方式

编程之法

Linux下中文编码方式很好解决,统一用UTF-8就没问题了,然而在Windows下这个简单的问题会有很多坑……为了在VS中让Qt正确显示中文,折腾了好久终于尝试出一个可用的方法,记录如下。

Linux和Qt内部都是使用UTF-8处理字符的,故考虑到跨平台的需求,将源代码保存为UTF-8格式兼容性最好。然而如果使用不带签名的UTF-8格式(即Unicode(UTF-8 无签名) - 代码页 65001)保存的话,在程序中存在奇数个字符的中文字符串时,无法正常编译,此时会出现error C2001:常量中有换行符。关于这个问题可参考:

Visual Studio error C2001:常量中有换行符(解决办法)

结论就是不要使用无签名的UTF-8编码源文件,无比的坑啊……另一篇文章中比较了各种编码格式的兼容性:

[C/C++] 各种C/C++编译器对UTF-8源码文件的兼容性测试(VC、GCC、BCB)

结论是使用带签名的UTF-8格式(即Unicode(UTF-8 带签名) - 代码页 65001)是兼容性最好的选择。选择了这种编码方式后可以正常编译含有中文字符串的源文件了,不过要是不做任何设置的话,此时在Qt中显示出来的效果会是乱码。

为了正确显示中文,需要在使用到中文的源文件头部加上这样一句预编译指令:

1
#pragma execution_character_set("utf-8")

这条预编译指令的作用是指定字符串的输出编码方式为UTF-8,注意,这与文件本身的编码方式没有关系。详细说明可参考MSDN:

execution_character_set

MSDN中还提到,这条指令已经要过时了,需要使用新方法来替代,不过目前还能使用,就不再折腾了……这条指令也是VS下特有的,GCC没有也不需要这个设置,故加上条件编译来保证跨平台移植的兼容性:

1
2
3
#ifdef  _MSC_VER
#pragma execution_character_set("utf-8")
#endif

这样设置后,Qt中就可以正确显示中文了。需要注意的是,其实并没有必要使用QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"))来指定Qt的编码方式,因为默认情况下使用的就是UTF-8编码方式。

Qt 是一个跨平台的 C++ 库,用于开发图形用户界面(GUI)和嵌入式应用程序。Qt 提供了丰富的功能和易用的界面设计工具,使开发人员能够轻松地创建各种应用程序。 当使用 Qt 进行编码保存时,Qt 倾向于使用 UTF-8 编码,因为 UTF-8 是一种兼容的、多字节的编码,支持包括中文在内的所有字符。尽管如此,如果代码中存在使用了中文字符的部分,Qt 在保存代码时有可能会自动将编码换为 ANSI 编码。 ANSI 编码是一种用于表示字符的标准编码方式,它是根据当前操作系统的本地设置来决定使用的字符集的。对于中文来说,ANSI 编码通常指的是 GBK 编码,这是一种中文字符集编码。虽然在国内仍然有很多人使用 GBK 编码,但它在国际上已经被逐渐淘汰,因为它只能表示有限的字符范围,而 UTF-8 是一种更加通用和全面的编码方式Qt 之所以会自动将保存的代码修编码为 ANSI,可能是因为 Qt 的默认设置中,保存文件时会根据操作系统的本地设置自动选择编码方式。这样做的目的可能是为了确保代码在特定操作系统上能够正常打开和运行。然而,这也可能会导致在其他操作系统或环境中出现编码不一致的问题。 为了避免自动修编码为 ANSI 的问题,可以在 Qt 的项目设置中手动选择使用 UTF-8 编码保存文件。这样做可以确保代码保持一致的编码,不受操作系统的本地设置影响。另外,也可以在代码中使用纯英文字符或者义字符来替代中文字符,以避免出现编码问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值