You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Facebook导出JSON中Emoji在Android显示异常问题排查

解决Facebook导出JSON中Emoji在Android显示乱码的问题

问题本质:双重编码导致的乱码

你看到的🤍是UTF-8双重编码的结果:

  • 原始白心Emoji(U+1F49D)的UTF-8字节是F0 9F 92 9D
  • 导出时这些字节被错误地以Latin-1(ISO-8859-1)编码解码成四个独立字符:ð(U+00F0)、Ÿ(U+009F)、¤(U+00A4)、(U+008D)
  • 之后这四个字符又被重新编码为UTF-8,就变成了你看到的乱码序列,Android直接读UTF-8自然无法识别为单个Emoji。

修复步骤

1. 反向解码修复编码错误

先把错误读取的字符串还原成原始字节,再用UTF-8重新解码:

// 假设wrongStr是你用UTF-8读取到的含乱码的字符串
val correctBytes = wrongStr.toByteArray(Charsets.ISO_8859_1)
val correctContent = String(correctBytes, Charsets.UTF_8)

这段代码的逻辑是:把错误的UTF-8字符串转成Latin-1字节(还原出Facebook导出时错误解码的原始字节),再用UTF-8解码得到正确的Emoji和文本。

2. 结合JSON解析库处理

如果用Gson、Moshi等解析库,建议先修复整个JSON字符串的编码,再传入解析器:

// 读取原始字节流
val jsonBytes = jsonInputStream.readBytes()
// 先按错误的UTF-8解码得到乱码字符串,再反向修复
val wrongJsonStr = String(jsonBytes, Charsets.UTF_8)
val correctJsonBytes = wrongJsonStr.toByteArray(Charsets.ISO_8859_1)
val correctJsonStr = String(correctJsonBytes, Charsets.UTF_8)

// 再用解析库处理正确的JSON字符串
val gson = Gson()
val data = gson.fromJson(correctJsonStr, YourDataClass::class.java)

3. 验证显示

修复后的字符串中的Emoji(U+1F49D)在Android 7.0及以上系统的TextView或Jetpack Compose中都能正常显示为单个白心图标,无需额外配置字体(系统默认字体已支持)。

补充说明

  • 日文sender_name正常显示的原因:日文的UTF-8编码字节范围不在Latin-1的可显示字符区间,所以导出时没有触发双重编码错误。
  • 如果后续遇到其他类似Emoji乱码,都可以用这个反向解码的方式修复,本质都是解决UTF-8被错误转码为Latin-1再重新编码的问题。

内容的提问来源于stack exchange,提问作者Yurowitz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 07:04:53