Qt QString 转换为 QByteArray 并相互转换

6

我在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;
}

您可以看到,我使用QString填充了所有16位范围内的字符,然后将它们转换为QByteArray(Utf8)并再次转换回QString。问题在于,值为0的字符和值大于55295的字符无法转换回QString。

如果我只使用1到< 55297的范围,则此测试通过。


0字符终止字符串,因此显然它不起作用。 - user4759923
忘记了 '\0',但我仍然不理解其他值的问题。 - JanSLO
也许这些Unicode字符尚未被实现。 - user4759923
2个回答

5

我有一个任务需要将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);

3

从55296 (0xD800)到57343 (0xdfff)的字符是替代字符。 你可以将其看作是后面字符的转义字符。它们本身没有意义。

您可以通过运行以下命令进行检查:

// 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]);
}

请纠正我,但是这些字符串仍然相等吗? - user_4685247
1
当调用QString::toUtf8()时,代码点U+D800到U+DFFF将被替换为0x3F,即“?”。这就是信息丢失的地方。 - Benjamin T
它们不是“转义字符”——代理项的组合值与其后面的值一起编码为代码点。如果您有一个不连续的代理项序列,则您的编码已经损坏,Qt 可以对其进行任何操作。包括用“?”替换杂散的代理项。 - peppe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接