QFile读取文本文件中文乱码处理

问题描述:

​ 在使用QFile读取文本文件时,如果文件内容是GBK(包括gb2313)格式的,则会显示为乱码

解决方式1:

​ 使用QTextStream指明待读取的文件的编码格式,如下:

QTextStream in(&file);
in.setCodec("GBK"); // 设置文件的编码格式为GBK
QString line = in.readLine(); // 此时以GBK的方式从文件中读取内容,结果正常

​ 以上方式只适用于待读取文件编码格式都相同(如都是GBK)的情况

解决方式2:

​ 使用QTextCodec的转换接口,参考代码如下:

while (!file.atEnd())
{
    QByteArray line = file.readLine();

    QTextCodec::ConverterState state;
    QString text = QTextCodec::codecForName("UTF-8")->toUnicode(line.constData(), line.size(), &state);
    if (state.invalidChars > 0)
    {
        text = QTextCodec::codecForName("GBK")->toUnicode(line);
    }
    
    ui->listWidget->addItem(text);
}

​ 也可封装成一个函数,直接调用,如下:

QString MusicPlayerDialog::byteArrayToUnicode(const QByteArray &array)
{
    // state用于保存转换状态,它的成员invalidChars,可用来判断是否转换成功
    // 如果转换成功,则值为0,如果值大于0,则说明转换失败
    QTextCodec::ConverterState state;
    // 先尝试使用utf-8的方式把QByteArray转换成QString
    QString text = QTextCodec::codecForName("UTF-8")->toUnicode(array.constData(), array.size(), &state);
    // 如果转换时无效字符数量大于0,说明编码格式不对
    if (state.invalidChars > 0)
    {
        // 再尝试使用GBK的方式进行转换,一般就能转换正确(当然也可能是其它格式,但比较少见了)
        text = QTextCodec::codecForName("GBK")->toUnicode(array);
    }
    return text;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值