美文网首页Qt学习
QT中文乱码问题(字符串变量)

QT中文乱码问题(字符串变量)

作者: 梦远心沉 | 来源:发表于2017-10-24 12:37 被阅读53次

    文章总结在最后面,想快速解决问题的可以直接拉到最后。

    一、使用变量显示中文字符

    到QT5以后,一般情况下要显示中文字符最简单的就是使用

    QStringLiteral(“我是中文”)
    

    但是QStringLiteral所用参数只能是字符串常量,不能为变量。

    所以当使用类似QStringLiteral(str)的代码时候会报错:

    error: expected primary-expression before 'enum'
             enum { Size = sizeof(QT_UNICODE_LITERAL(str))/2 - 1 }; \
             ^
    

    因此想到使用

    string str = "这是中文";
    QString::fromLocal8Bit(str);
    

    但会发现qDebug后输出的是

    "杩欐槸涓\uE15F枃"
    

    这时候使用QString::fromStdString(str)就能解决这个问题

    string str = "这是中文";
    QString::fromStdString(str)
    

    输出结果:

    "这是中文"
    

    以上是针对于字符串变量是string类型的情况,若是QString则先将其转成string,参考代码如下:

    QString data = query.value(i).toString();//获得数据库中第i个字段的值
    QByteArray cdata = data.toLocal8Bit();
    string str = string(cdata).data();//这两行换成string str = data.toStdString();依然会乱码
    qDebug()<<QString::fromStdString(str);//输出转换成中文字符的结果
    

    二、出现部分中文乱码

    如果上面的方法还不行,就用以下方法:
    该方法同时可以解决部分乱码问题,比如末尾句号变成‘??’,‘(’后的汉字变成‘??’:

    这里获取mysql第二个字段testcol的值:


    这时候mysql中的数据是没问题的:


    但qDebug的结果这三个地方都出现了部分乱码:


    解决方法:

    直接在main函数里加上:

    #include <QTextCodec>
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
    

    QT5可以用,有这个函数的。

    就像这样:

    Paste_Image.png

    超简洁的总结

    • 一、QT5使用变量显示中文字符(不能用QStringLiteral):
    string str = "这是中文";
    QString::fromStdString(str)
    
    • 二、部分中文乱码(如“??”),在主函数添加:
    #include <QTextCodec>
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
    

    相关文章

      网友评论

        本文标题:QT中文乱码问题(字符串变量)

        本文链接:https://www.haomeiwen.com/subject/dtmtpxtx.html