问题引入:
    一.toLocal8Bit() 与 toUtf8()
    在没有setCodecForLocale(QTextCodec::codecForName(“UTF-8”)) 的情况下,两者才有区别
    <1> toLocal8Bit()是转为windows平台的默认编码格式, 即GBK
    image.png
    <2> toUtf8()就是转为utf-8, 可以看到它的中文出现了乱码
    image.png

    二. QString在Gbk,Unicode与utf-8下编码相同吗?
    <1> 编码为Gbk时
    image.png
    image.png
    <2> 编码为Unicode时
    image.png
    image.png
    <3> 编码为utf-8时
    image.png
    image.png
    发现三者完全相同, 所以QString与CString,string不同, 前者可无视编码, 后两者则随编码不同而不同
    QString比它们两个数据类型的高明之处就在于,它存的是一个数据结构的指针, 而另外两个存的直接就是字符

    解决方案:
    1 如果qDebug的中文乱码, 就在头文件设置文件编码格式为UTF-8. 一般来说, 哪个文件里的qDebug出现了乱码, 就在对应的头文件处加上这句. 这样所有的字符串都是UTF-8编码的字符串, 用qDebug()输出是不会乱码的.
    #pragma execution_character_set(“utf-8”)
    image.png

    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进制字符串)
    image.png
    (2) UTF-8字符串
    image.png

    正是因为字符串默认是UTF-8格式, 也带来了一些问题.
    比如c++自带的标准库函数用到的参数均是采用Gbk字符串,
    若我们要使用strcmp(), 如果我们不将UTF-8字符串转换成Gbk字串, 就不能正常使用.

    image.png
    上图中, 未注明编码说明此种类型不受编码格式的影响