【问题标题】:Qt QString to QByteArray and backQt QString 到 QByteArray 并返回
【发布时间】:2016-11-27 06:06:02
【问题描述】:

我在从 QString 转换为 QByteArray 然后再转换回 QString 时遇到问题:

int main() {

    QString s;

    for(int i = 0; i < 65536; i++) {
        s.append(QChar(i));
    }

    QByteArray ba = s.toUtf8();

    QString s1 = QString::fromUtf8(ba);

    if(areSame(s, s1)) {
        qDebug() << "OK";
    } else {
       qDebug() << "FAIL";
       outputErrors(s, s1);
    }

    return 0;
}

如您所见,我用 16 位范围内的所有字符填充 QString。然后将它们转换为 QByteArray (Utf8) 并返回到 QString。问题是值为0的字符和值大于55295的字符无法转换回QString。

如果我保持在 1 到

【问题讨论】:

  • 0字符结束一个字符串,所以很明显是不行的
  • 忘记了 '\0' 但我仍然不明白其他值的问题。
  • 可能这些unicode字符没有实现

标签: c++ qt qstring qbytearray


【解决方案1】:

我的任务是将std::string 转换为QString,并将QString 转换为QByteArray。以下是我为完成此任务所做的工作。

std::string str = "hello world";

QString qstring = QString::fromStdString(str);

QByteArray buffer;

如果您查找“QByteArray::append”的文档,它需要QString 并返回QByteArray

buffer = buffer.append(str);

【讨论】:

    【解决方案2】:

    从 55296 (0xD800) 到 57343 (0xdfff) 的字符是 surrogate characters。 您可以将其视为其后字符的转义字符。它们本身没有任何意义。

    你可以通过运行来检查它:

    // QChar(0) was omitted so s and s1 start with QChar(1)
    for (int i = 1 ; i < 65536 ; i++)
    {
        qDebug() << i << QChar(i) << s[i-1]  << s1[i-1] << (s[i-1] == s1[i-1]);
    }
    

    【讨论】:

    • 如果我错了,请纠正我,但字符串不会仍然相等吗?
    • 当调用 QString::toUtf8() 代码点 U+D800 到 U+DFFF 被替换为 0x3F,即 '?'。这就是信息丢失的地方。
    • 它们不是“转义字符”——代理项的组合值及其后的值对代码点进行编码。如果你有一个不连贯的代理序列,那么你的编码就会被破坏,Qt 可以对它做任何事情。包括用'?' 替换流浪代理。
    猜你喜欢
    • 2016-10-14
    • 2013-10-16
    • 2012-12-17
    • 1970-01-01
    • 2017-12-18
    • 2013-12-25
    • 2018-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多