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
相关产品推荐
相关产品推荐

