Qt转化编码的一个坑

发布于 11 天前  126 次阅读


编码编码

虽说上班这么多年了,昨天修复一个bug的时候还是被屎一样的代码给坑了

先说逻辑
业务本质是想把 Unicode编码转成GBK编码

    QTextCodec* codec = QTextCodec::codecForName("GBK");
    ushort ss = 23435;
    QString strUn = QString::fromUtf16(&ss, 1);

    if (codec && codec->canEncode(strUn))
    {
        QString gStr = codec->fromUnicode(strUn);
        std::string = gStr.toStdString();
    }

在某些unix环境中,这个gStr就已经是空的了。
原因是 codec->fromUnicode(strUn); 返回的是QByteArray。

QByteArray转QString是调用的Qt的fromAscii_helper这个函数,也就是本次是gdk又强转了一次latin的编码,导致丢数据。

Qt中的转化代码是走的这里。 敲重点,目前QByteArray是gbk编码,但是这样强转会当做Ascii来解析,所以出现了丢数据。
Qt源码

QString::Data *QString::fromAscii_helper(const char *str, int size)

具体到WPS的某个功能的话我就懒得吐槽了,反正这么多年windows也一直没事儿。逃)

toStdString

这个函数也慎用,不管你是啥编码的QString,这样导出最后也是会当做ascii来转,也会出现乱码或者丢数据,慎用慎用!


公交车司机终于在众人的指责中将座位让给了老太太