C++ | Qt 中文乱码总结【持续更新】

19 篇文章 5 订阅
7 篇文章 1 订阅

 ★ QT内部采用unicode字符集、支持utf-8编码,而windows默认使用(GBK/GB2312/GB18030)

1.某些SDK传入路径时不支持中文路径,使用toLocal8Bit().data() 转换为本地的(GBK/GB2312/GB18030)编码

QString res_path=QApplication::applicationDirPath()+"/中文/beauty_res";
SDK::Init(res_path.toLocal8Bit().data());

2.QT编辑器包含中文时编译报错,使用notepad++更改cpp文件编码格式为:UCS-2 Little Endian编码

3.qDebug()输出中文时控制台区域乱码:在cpp文件第一行添加:#pragma execution_character_set("utf-8")

4.判断读取的Text变量是否等于某个字符串:

方法一:QString::fromLocal8Bit()     

使用fromLocal8Bit()函数,可以实现从本地字符集GB到Unicode的转换,从而处理汉语显示乱码等问题

    QString name=ui->label->text();
    if(name==QString::fromLocal8Bit("珊瑚色"))
    {
        qDebug()<<"equal";

    }
    else{
        qDebug()<<"no";
    }

方法二:在cpp文件第一行添加:#pragma execution_character_set("utf-8")

5.Json操作:保存、读取含中文的Json,使用GBKToUTF8()

#include <QTextCodec>
#include <QApplication>
#include <QFile>
#include <QJsonObject>
#include <QJsonDocument>

QString GBKToUTF8(QString s)
{
    QTextCodec *codec=QTextCodec::codecForName("UTF-8");
    QTextCodec::setCodecForLocale(codec);
    return codec->toUnicode(s.toUtf8());
}

void SaveJson()
{
    QFile *file=new QFile(QApplication::applicationDirPath()+"/history.json");
    if(!file->open(QIODevice::WriteOnly|QIODevice::Truncate))
    {
        qDebug()<<"open json file failed";
        return;
    }
    QJsonObject values;
    values.insert("lipStickName1",GBKToUTF8("西瓜红"));
    values.insert("lipStickValue1",20);
    QString lipStick2="珊瑚色";
    values.insert("lipSticksName2",GBKToUTF8(lipStick2));
    values.insert("lipStickValue2",10);
    QJsonDocument doc;
    doc.setObject(values);
    QByteArray root=doc.toJson(QJsonDocument::Compact);
    QString strJson(root);
    QTextStream in(file);
    in<<strJson;
    file->close();
}

void ReadJson()
{
    QFile *file=new QFile(QApplication::applicationDirPath()+"/history.json");
    if(!file->open(QIODevice::ReadOnly))
    {
        qDebug()<<"open json file failed";
        return;
    }
    QJsonParseError *error=new QJsonParseError;
    QJsonDocument doc=QJsonDocument::fromJson(file->readAll(),error);
    if(error->error!=QJsonParseError::NoError)
    {
        qDebug()<<"json file wrong";
        return;
    }
    else
    {
        QJsonObject obj=doc.object();
        QString lipStickName1=obj.value("lipStickName1").toString();
        qDebug()<<lipStickName1;
    }
    file->close();
}

6.打开含有中文路径的文件

    QString sticker_json_path = QApplication::applicationDirPath() + "/beauty_res/sticker/sticker_config.json";
    QFile file( QString::fromLocal8Bit(sticker_json_path.toLocal8Bit()));
    if(!file.open(QIODevice::ReadOnly)) {
        qDebug() << "test:sticker_config open failed!";
        return;
    } else {
        qDebug() <<"test:sticker_config open successfully!";
    }

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烫青菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值