将十六进制QString转换为UTF-8 QString

时间:2015-01-29 05:13:01

标签: c++ qt utf-8

在我的项目中,我需要将十六进制QString(“c2a774657374”)转换为UTF-8编码的QString(“§test”)

我当前的函数(HexToAscii)确实将十六进制转换为ascii,但没有正确编码:

void HexToInt(QString num_hex, int &num_int)
{
    uint num_uint;
    bool ok;
    num_uint = num_hex.toUInt(&ok,16);
    num_int = (int)num_uint;
}

void HexToAscii(QString &Input)//Input == "c2a774657374"
{
    int inputInt;
    QString tempInput;
    for(int i=0; i<Input.length()/2; i++)
    {
        HexToInt(Input.mid(i*2, 2), inputInt);
        tempInput.append((unsigned char)inputInt);
    }
    Input = tempInput;//Input == "§test"
}

但是,这只会转换每个字节,而不会遵循UTF-8编码。 当我想要它时,我当前函数的结果是(“§test”)(“§test”)

如何编辑我的HexToAscii函数以转换为UTF-8编码的QString?

感谢您的时间。

2 个答案:

答案 0 :(得分:2)

要获取十六进制编码字符串的解码副本,可以使用QByteArray::fromHex()静态函数。

QByteArray hex = QByteArray::fromHex("c2a774657374");
QString str = QString::fromUtf8(hex);

答案 1 :(得分:1)

嗯,在UTF-8上,最多127个是单字节。问题是QString如何处理两个字节序列。

QString无法判断“c2”是什么,而是继续分配以等待下一个字节。

您可以通过检查返回的十六进制是否大于127(7f)并在附加到QString之前将其与下一个十六进制连接来解决此问题。

尝试:

#include <QCoreApplication>
#include <iostream>


void HexToInt(QString num_hex, int &num_int)
{
    uint num_uint;
    bool ok;
    num_uint = num_hex.toUInt(&ok,16);
    num_int = (int)num_uint;
}

QString HexToAscii(QString Input)//Input == "c2a774657374"
{
    int inputInt;
    int twobytesequece;
    QString tempInput;
    for(int i=0; i<Input.length()/2; i++)
    {
        HexToInt(Input.mid(i*2, 2), inputInt);
        if (inputInt <= 0x7f) {
            tempInput.append((unsigned char)inputInt);
        } else {
            i++;
            HexToInt(Input.mid(i*2, 2), twobytesequece);
            inputInt = inputInt << 8 | twobytesequece;
            tempInput.append((unsigned char)inputInt);
        }
    }
    return tempInput;
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QString test = "c2a774657374";
    test = HexToAscii(test);

    return a.exec();
}