【问题标题】:QJsonObject and international charactersQJsonObject 和国际字符
【发布时间】:2016-10-07 14:09:01
【问题描述】:

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 字符串?

【问题讨论】:

标签: json qt character-encoding


【解决方案1】:

QJsonObject::toJson() 以十六进制形式返回带有国家字符的字符串 价值观

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

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

通常,QDebug 在引号内打印数组并转换控件 或非 US-ASCII 字符到它们的 C 转义序列 (\xAB)。这 方式,输出总是 7-bit clean 并且字符串可以被复制 如有必要,从输出中粘贴回 C++ 源代码。

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

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

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

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

注意:

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

【讨论】:

  • 关于 Qt 中的字符串文字,这正是 QStringLiteral 宏的用途。
  • @MrEricSir , QStringLiteral 宏专门用于在编译时从文字中生成QString,以避免在运行时生成的开销。我不确定在使用它时是否可以安全地在其源代码文件中的文字中使用依赖于语言环境的非 ascii 字符。你能确认一下吗?
  • @MrEricSir ,因为QStringLiteral 似乎使用宽字符串文字herehere,它可能是安全的。但我永远不会期望像QString("żółć") 这样的东西是安全的。我说得对吗?
  • 只要您使用最新的编译器,QStringLiteral 应该始终执行正确的转换。我相信采用字符串文字的QString 构造函数只会从 UTF-8 转换,这可能是也可能不是我们想要的。
  • 好的,那么我应该如何使用国际字符获取用户输入并使用它们构建 JSON?
猜你喜欢
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 2016-08-18
  • 1970-01-01
  • 2010-09-08
  • 2013-08-15
相关资源
最近更新 更多