问题引入:
一.toLocal8Bit() 与 toUtf8()
在没有setCodecForLocale(QTextCodec::codecForName(“UTF-8”)) 的情况下,两者才有区别
<1> toLocal8Bit()是转为windows平台的默认编码格式, 即GBK
<2> toUtf8()就是转为utf-8, 可以看到它的中文出现了乱码
二. QString在Gbk,Unicode与utf-8下编码相同吗?
<1> 编码为Gbk时
<2> 编码为Unicode时
<3> 编码为utf-8时
发现三者完全相同, 所以QString与CString,string不同, 前者可无视编码, 后两者则随编码不同而不同
QString比它们两个数据类型的高明之处就在于,它存的是一个数据结构的指针, 而另外两个存的直接就是字符
解决方案:
1 如果qDebug的中文乱码, 就在头文件设置文件编码格式为UTF-8. 一般来说, 哪个文件里的qDebug出现了乱码, 就在对应的头文件处加上这句. 这样所有的字符串都是UTF-8编码的字符串, 用qDebug()输出是不会乱码的.
#pragma execution_character_set(“utf-8”)
2 如果软件界面的中文乱码,就在文件中添加预编绎代码,如下:
QTextCodec::setCodecForLocale(QTextCodec::codecForName(“UTF-8”)); // #include
如果还不行,可以再试试给框起来的这句改成
QTextCodec::setCodecForLocale(QTextCodec::codecForName(“GBK”));
一般来说, 用VS版QT的用户,要设置上面两个
而用QT Creator的用户, 只需设置第二个即可, 因为IDE已经帮你默认设置好第一个了
上述设置不仅可以解决中文乱码, 还有一个好处, 就是整个项目的文件都是UTF-8格式,
我们可以写的任意一个字串都是UTF-8格式的字串, 用下面的方式可直接定义一个中文的QString
QString str1 = QString(“游戏聊天窗口”); // UTF-8格式字符串
让我们来看一下, 我们常用的Gbk字符串 与 UTF-8字符串 的差异
(1) Gbk字符串(即图中的16进制字符串)
(2) UTF-8字符串
正是因为字符串默认是UTF-8格式, 也带来了一些问题.
比如c++自带的标准库函数用到的参数均是采用Gbk字符串,
若我们要使用strcmp(), 如果我们不将UTF-8字符串转换成Gbk字串, 就不能正常使用.
上图中, 未注明编码说明此种类型不受编码格式的影响