【转】Qt 5 中解决中文乱码的方法

————————————————————————————————————————————
版权声明:本文为CSDN博主「liyuanbhu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/liyuanbhu/article/details/72596952
————————————————————————————————————————————

在 Qt 4 的时代,解决中文乱码挺麻烦。要考虑用的是什么编译器,具体的可以参考下面这篇文章:
http://blog.csdn.net/brave_heart_lxl/article/details/7186631
到了 Qt 5 的年代,这个问题变得简单了些。因为根据 Qt 的文档:http://doc.qt.io/qt-5.6/qstring.html#QString-7 中规定 QString 的 const char* 构造函数是调用 fromUtf8() 构造的。所以要求字符串字面量是 UTF-8 编码的字节。

这里先要解释一下下面两个概念:
● 源码字符集(the source character set):源码文件是使用何种编码保存的
● 执行字符集(the execution character set):可执行程序内保存的是何种编码(程序执行时内存中字符串编码)

源码字符集很容易理解,就是我们源代码的编码。为了我们的代码能够跨平台,源文件要保存为带 BOM 的 utf-8。

执行字符集就麻烦多了。比如我们下面的代码片段:
QString str(“我是中文”);
即使这个文件存为 utf-8 格式了,编译成 exe 文件时,编译器也可能对这个字符串常量进行转码,转为别的编码格式。

在 gcc 中,控制这个转码操作的命令行参数是:
-fexec-charset=charset
如果不指定的话默认是 utf-8。所以我们用 gcc 时很少关注这个问题。

Viual Stdio 中就麻烦多了。这里先说 Visual stdio 2015,这个是我现在用的编译环境。VS2015 中如果源代码是 utf-8的,执行字符集默认是本地 Locale 字符集,对于简体中文的 windows 系统来说,这个 本地Locale字符集是 gb18030。所以直接显示汉字会全是乱码。

解决这个乱码有三个办法:

  1. 第一个办法是编译时加入命令行参数,在 Qt 的 pro 文件中可以这样:
    msvc:QMAKE_CXXFLAGS += -execution-charset:utf-8

  2. 第二个办法是在源文件中加入:
    #pragma execution_character_set(“utf-8”)

  3. 更好的办法是源代码写为:
    QString str(u8"我是中文");
    当然,这里要求编译器支持 C++11,因此上面的代码在 VS2005、VS2008 上是无法编译通过的。

另外,如果源代码保存为不带 BOM 的 utf-8。那需要告诉 VS2015 我们的编码格式是 utf-8,可以在 pro 文件中加入如下的代码:
msvc:QMAKE_CXXFLAGS += -source-charset:utf-8

另外再说说 VS2005、VS2008 下该如何设置。首先这两个编译器都不支持 C++11,也不支持执行字符集的设置,执行字符集就是默认的本地 Locale 字符集。所以我们的代码只能写为:
QString str = QString::fromLocal8Bit(“我是中文”);
————————————————————————————————————————————

附上一个相关的图片:忘了图片是从哪儿摘过来的,如有大佬感觉被冒犯,请联系我删除
在这里插入图片描述
————————————————————————————————————————————

现在的习惯一般就是:

  1. pro文件中
    msvc{
    QMAKE_CXXFLAGS +=/utf-8
    }
  2. 所有的源文件全部是使用utf-8编码
  3. 如果是别人写的项目,第一步是检查编码并统一转成utf8,一般用不上这一步了
  4. 文件编码好解决,io 接受和发送消息 ,也要警惕因为编码出现的问题,最好也要统一成utf8,或者至少使用统一中编码
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值