————————————————————————————————————————————
版权声明:本文为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。所以直接显示汉字会全是乱码。
解决这个乱码有三个办法:
-
第一个办法是编译时加入命令行参数,在 Qt 的 pro 文件中可以这样:
msvc:QMAKE_CXXFLAGS += -execution-charset:utf-8 -
第二个办法是在源文件中加入:
#pragma execution_character_set(“utf-8”) -
更好的办法是源代码写为:
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(“我是中文”);
————————————————————————————————————————————
附上一个相关的图片:忘了图片是从哪儿摘过来的,如有大佬感觉被冒犯,请联系我删除
————————————————————————————————————————————
现在的习惯一般就是:
- pro文件中
msvc{
QMAKE_CXXFLAGS +=/utf-8
} - 所有的源文件全部是使用utf-8编码
- 如果是别人写的项目,第一步是检查编码并统一转成utf8,一般用不上这一步了
- 文件编码好解决,io 接受和发送消息 ,也要警惕因为编码出现的问题,最好也要统一成utf8,或者至少使用统一中编码