如何使用jq将Unicode字节序列转换为可正常显示的emoji字符
解决方案
问题根因
Facebook导出的Messenger JSON文件中,emoji被存储为UTF-8字节对应的\u00xx格式单字节转义序列,jq默认将这类转义解析为ISO-8859-1(Latin1)编码的单个字符,不会自动合并为UTF-8多字节字符,因此直接输出会出现乱码。
解决方法
你可以通过iconv转码配合jq输出,或者直接在jq内完成编码转换,两种方案都可以实现正常输出emoji:
方案1:配合iconv转码(兼容性最好)
直接在jq命令后追加iconv编码转换步骤,将jq默认输出的Latin1字符转为UTF-8:
echo '{"content":"\u00f0\u009f\u00a4\u00b7\u00f0\u009f\u008f\u00bf\u00e2\u0080\u008d\u00e2\u0099\u0082\u00ef\u00b8\u008f"}' | jq -c '.' | iconv -f latin1 -t utf-8
输出结果:
{"content":"🤷🏿♂️"}
方案2:纯jq内部实现转换(无需额外依赖)
如果使用jq 1.5及以上版本,可以直接通过内置函数完成字节转UTF-8的操作:
echo '{"content":"\u00f0\u009f\u00a4\u00b7\u00f0\u009f\u008f\u00bf\u00e2\u0080\u008d\u00e2\u0099\u0082\u00ef\u00b8\u008f"}' | jq -c '.content |= (map(ord) | implode)'
内容的提问来源于stack exchange,提问作者Dan Dascalescu
相关产品推荐
相关产品推荐

