Facebook JSON数据emoji无法正常显示?

izkcnapc  于 2023-03-31  发布在  其他
关注(0)|答案(1)|浏览(140)

在stackoverflow上检查了很多个问题和答案后,我无法让它工作。问题是,考虑以下来自Facebook可下载JSON数据的JSON对象:

{
    "sender_name": "megalo\u00e5\u00bd\u00a9",
    "timestamp_ms": 1679173611981,
    "content": "Reacted \u00f0\u009f\u00a4\u008d to your message "
}

问题:在上面的JSON示例中,发送者姓名包含日语字符,聊天消息内容包含一个白色的心,由UTF-8 unicode escape sequence表示,即\u00f0\u009f\u00a4\u008d。然而,当在Android的TextView或Jetpack Compose上显示时,它显示为ð¤,这显然是两个独立的字符。Android无法将整个4部分序列解释为一个完整的emoji。
什么没有工作:用UTF-8阅读实际的JSON并没有做到这一点。Android将无法理解字面上只有一个emoji而不是两个unicode字母。下面是解析逻辑,直接从json文件读取JSON。

val actualJson = String(jsonInputStream.readBytes(), Charsets.UTF_8)
为什么Android无法正确阅读UTF-8内容?

k10s72fa

k10s72fa1#

解决这个问题的变通方法是一种黑客。为了确保Android首先编码拉丁语1字符,然后最后保留UTF-8,我不得不将字符串转换为字节数组,同时考虑它是拉丁语1字符串而不是UTF-8,但随后将其解码回UTF-8。我不太清楚为什么这会起作用,但它'这是唯一做的事情,我很高兴它做了,因为我即将放弃整个事情后,浪费了几个小时寻找答案。

val finalString = String(initialString.toByteArray(Charsets.ISO_8859_1), Charsets.UTF_8)

这实际上成功了,没有其他解决方案可以工作,即使是公共文本的StringEscapeUtils.escapeJava/unescapeJava方法也不行。

相关问题