【问题标题】:Convert hex QString to UTF-8 QString将十六进制 QString 转换为 UTF-8 QString
【发布时间】:2015-01-29 05:13:00
【问题描述】:

在我的项目中,我需要将十六进制 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?

感谢您的宝贵时间。

【问题讨论】:

  • QString 内部不使用 UTF-8 编码,因此不清楚“UTF-8 编码的 QString”是什么意思。

标签: c++ qt utf-8


【解决方案1】:

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

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

【讨论】:

  • str 最终仍然是“c2a774657374”。我已经试过了。
  • 等等,我想我只是执行错了。给我一点时间。
  • 你说的也有效,但是我遇到了和 CapEnt 一样的问题,简单地将它实现到我的函数中是行不通的。这显然是因为我通过引用传递了结果,而不是返回它。您的答案也是正确的(并且代码少得多),尽管 CapEnt 帮助我解决了我的问题,所以我给了他答案。两个答案都很好:)
【解决方案2】:

嗯,在 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();
}

【讨论】:

  • 完美。正是我需要的,让我快速测试一下。 :)
  • 它不起作用,由于某种原因,输出似乎仍然是十六进制字符串。
  • 这真的很好奇。看看我的截图:link
  • 嗯,我直接复制并粘贴了它来代替我当前的函数,所有调用它的字符串似乎都返回了十六进制表示。让我试试看
  • 我认为我发现你的代码有问题:而不是通过引用传递调用 HextoAscii 的 QString,返回结果。我将更改我的回复以显示给您。
猜你喜欢
  • 2014-05-08
  • 1970-01-01
  • 2014-02-24
  • 1970-01-01
  • 2020-02-06
  • 2014-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多