使用Disqus API结果编码问题(2个Unicode字符应解释为一个)

时间:2016-05-18 14:08:20

标签: qt encoding character-encoding disqus qstring

我有一个Qt应用程序,它从Disqus API接收JSON对象中的字符串:

{ "title": "Swiftkey pr\u0102\u0160dit votre choix d\u2019emoji gr\u0102\u02d8ce au clavier Swiftmoji" }

(还有更多,但我只写了重要的内容)

然后我将title字符串放在QString

// Assuming that "reply" is the QNetworkReply * containing the Disqus API response.
QByteArray disqusReply = reply->readAll();
// disqusReply == "{ \"title\": \"Swiftkey pr\u0102\u0160dit votre choix d\u2019emoji\ gr\u0102\u02d8ce au clavier Swiftmoji" }"
QJsonDocument doc = QJsonDocument::fromJson(disqusReply);
QJsonObject obj = doc.object();
QString title = obj["title"].toString();

后来我在QML文本中写了它。它应该显示“Swiftkeypréditvotrechoix d'emojigrâceauclavier Swiftmoji ”,但它会显示“Swiftkeypréditivotrechoix d'emogrâceauclavier Swiftmoji ”。

正如您所看到的,存在一些编码问题,其中两个连续的Unicode字符应仅被解释为一个字符(“ĂŠ”而不是“é”和“â”而不是“à”。如何(使用Qt或QML)显示正确的字符?我必须执行哪些编码转换(使用Qt或QML)才能解决这些编码问题?

其他信息:该错误发生在Windows 10 64位上。

编辑:你可以在这里找到错误:https://disqus.com/api/3.0/threads/list.json?since=2016-05-18T14%3A08%3A27%2B00%3A00&forum=frandroid&api_key=7o0xSBOEzN2AG6yxcJgeJbeEbACBfGhgnoIRHu7umbifKAvXQpisYKT3KSXF9nPN

3 个答案:

答案 0 :(得分:1)

好吧,我认为双重编码或服务器端的其他问题,而不是来自客户端的问题。因为您的代码必须是pr\u00e9dit而不是pr\u0102\u0160dit。如果你使用clean_title而不是你的json-answer的title,你将获得正确的字符串,因为它的编码是正确的。

<强> UPD:

正如我在评论中所说 - 有两条回复有同样的消息。 Id 4836688567 编码字符串错误。并且 4836587900 正确。有许多不同编码的新闻的双重变体。

<强>首先

{
"feed":"https://frandroid.disqus.com/httpwwwfrandroidcomandroidapplications358721_swiftkey_predire_choix_demoji_grace_clavier_swiftmoji/latest.rss",
"identifiers":[],
"dislikes":0,
"likes":0,
"message":"",
"id":"4836688567",
"createdAt":"2016-05-18T09:08:43",
"category":"448171",
"author":"3938134",
"userScore":0,
"isSpam":false,
"signedLink":"http://disq.us/?url=http%3A%2F%2Fwww.frandroid.com%2Fandroid%2Fapplications%2F358721_swiftkey-predire-choix-demoji-grace-clavier-swiftmoji&key=nqCbe6jgfwM-skLyqTf3lg",
"isDeleted":false,
"raw_message":"",
"isClosed":false,
"link":"http://www.frandroid.com/android/applications/358721_swiftkey-predire-choix-demoji-grace-clavier-swiftmoji",
"slug":"httpwwwfrandroidcomandroidapplications358721_swiftkey_predire_choix_demoji_grace_clavier_swiftmoji",
"forum":"frandroid",
"clean_title":"Swiftkey pr\u0102\u0160dit votre choix d\u2019emoji gr\u0102\u02d8ce au clavier Swiftmoji",
"posts":0,
"userSubscription":false,
"title":"Swiftkey pr\u0102\u0160dit votre choix d\u2019emoji gr\u0102\u02d8ce au clavier Swiftmoji",
"highlightedPost":null
}

<强>第二

{
"feed":"https://frandroid.disqus.com/swiftkey_predit_votre_choix_d8217emoji_grace_au_clavier_swiftmoji/latest.rss",
"identifiers":["358721 http://www.frandroid.com/?p=358721"],
"dislikes":0,
"likes":1,
"message":"",
"id":"4836587900",
"createdAt":"2016-05-18T08:16:30",
"category":"448171",
"author":"3938134",
"userScore":0,
"isSpam":false,
"signedLink":"http://disq.us/?url=http%3A%2F%2Fwww.frandroid.com%2Fandroid%2Fapplications%2Fgoogle-apps%2F358721_swiftkey-predire-choix-demoji-grace-clavier-swiftmoji&key=UU8IrLN_UDXEggF6wHjAYg",
"isDeleted":false,
"raw_message":"",
"isClosed":false,
"link":"http://www.frandroid.com/android/applications/google-apps/358721_swiftkey-predire-choix-demoji-grace-clavier-swiftmoji",
"slug":"swiftkey_predit_votre_choix_d8217emoji_grace_au_clavier_swiftmoji",
"forum":"frandroid",
"clean_title":"Swiftkey pr\u00e9dit votre choix d\u2019emoji gr\u00e2ce au clavier Swiftmoji",
"posts":13,
"userSubscription":false,
"title":"Swiftkey pr\u00e9dit votre choix d&#8217;emoji gr\u00e2ce au clavier Swiftmoji",
"highlightedPost":null
}

如您所见,网址与新闻来源不同。但为什么其中一些编码错误 - 这是一个问题。

UPD 2:

或许它是 RSS 错误。我们来看prédit字。在第二个变体中,RSS返回xml,其内容已经编码为é,并且feed链接看起来很正常。在第一个变体中,RSS返回Ă,它的feed链接看起来像是异常的 - 感觉它需要整个url并进行另一个编码。

答案 1 :(得分:0)

你试过吗

QByteArray disqusReply
    = QString::fromUtf8(reply->readAll().data()).toLocal8Bit();

?您可能更愿意延迟此转换,直到将字符串实际写入QML文本。

答案 2 :(得分:0)

QJsonDocument需要UTF-8编码的字符串。加载文档时,您的文档是否以UTF-8编码?