QJsonObject和国际字符

时间:2016-10-07 14:09:01

标签: json qt character-encoding

我遇到QJsonObject字符编码问题。 QJsonObject::toJson()返回带有国际字符的字符串作为十六进制值:

s:  "żółć"
obj:  QJsonObject({"s":"żółć"})
doc:  QJsonDocument({"s":"żółć"})
JSON:  "{\n    \"s\": \"\xC5\xBC\xC3\xB3\xC5\x82\xC4\x87\"\n}\n"

代码:

#include <QCoreApplication>
#include <QDebug>
#include <QJsonDocument>
#include <QJsonObject>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QString s = "żółć";
    qDebug() << "s: " << s;

    QJsonObject obj;
    obj["s"] = s;
    qDebug() << "obj: " << obj;

    QJsonDocument doc(obj);
    qDebug() << "doc: " << doc;


    qDebug() << "JSON: " << doc.toJson();


    return a.exec();
}

如何获取带有国际字符的JSON字符串?

1 个答案:

答案 0 :(得分:2)

  

QJsonObject::toJson()返回国家字符为hex的字符串   值

假设您的意思是QJsonDocument::toJson()这不是真的,QJsonDocument::toJson()会返回UTF-8编码的QByteArray,这样它就可以编码所有可能的字符或代码点,由Unicode定义。之后,您可以发送/保存结果QByteArray以便稍后阅读和解析,您应该可以从中获取原始字符串。

因此,您在调试输出中看到的HEX字符实际上并不存在,它们只是QDebug's way of printing QByteArrays

  

通常,QDebug会在引号内打印数组并转换控件   或非US-ASCII字符到其C转义序列(\xAB)。这个   方式,输出总是7位干净,字符串可以复制   如果需要,从输出中粘贴回C ++源代码。

您可以使用qDebug().noqoute()查看JSON字节数组的外观,而不必转义这些字符:

qDebug().noquote() << "JSON: " << doc.toJson();

或者,您可以将其打印为QString代替:

qDebug() << "JSON: " << QString::fromUtf8(doc.toJson());

注意:

将非ascii字符放在字符串文字中是非常糟糕的做法。您应该在指定编码时从资源或转义字符串文字中读取它们(可能使用QString::fromUtf8()QString::fromUtf16(),...)。