我遇到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字符串?
答案 0 :(得分:2)
QJsonObject::toJson()
返回国家字符为hex的字符串 值
假设您的意思是QJsonDocument::toJson()
这不是真的,QJsonDocument::toJson()
会返回UTF-8编码的QByteArray
,这样它就可以编码所有可能的字符或代码点,由Unicode定义。之后,您可以发送/保存结果QByteArray
以便稍后阅读和解析,您应该可以从中获取原始字符串。
因此,您在调试输出中看到的HEX字符实际上并不存在,它们只是QDebug
's way of printing QByteArray
s:
通常,
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()
,...)。