在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内容?
1条答案
按热度按时间k10s72fa1#
解决这个问题的变通方法是一种黑客。为了确保Android首先编码拉丁语1字符,然后最后保留UTF-8,我不得不将字符串转换为字节数组,同时考虑它是拉丁语1字符串而不是UTF-8,但随后将其解码回UTF-8。我不太清楚为什么这会起作用,但它'这是唯一做的事情,我很高兴它做了,因为我即将放弃整个事情后,浪费了几个小时寻找答案。
这实际上成功了,没有其他解决方案可以工作,即使是公共文本的
StringEscapeUtils.escapeJava/unescapeJava
方法也不行。