Android TextView无法显示服务器JSON对象中的Emoji,显示为方块
嘿,这个问题我之前踩过坑!TextView显示JSON里的Emoji变成方块,大概率是编码、字体或者解析环节出了问题,给你整理几个实用的解决办法:
解决TextView无法显示JSON中Emoji的问题
1. 先搞定JSON解析的编码问题
很多时候问题根源在解析JSON时的字符编码错误。服务器返回的JSON一般是UTF-8编码,你得确保解析过程中没搞错编码:
- 用
JSONObject解析时,从响应流读取字符串要指定UTF-8:
String jsonString = new String(responseBody, StandardCharsets.UTF_8); JSONObject jsonObject = new JSONObject(jsonString); String emojiContent = jsonObject.getString("your_emoji_key");
- 如果用Gson解析,默认就是UTF-8,但如果有特殊配置需求,保持默认即可:
Gson gson = new GsonBuilder().create(); YourDataModel dataModel = gson.fromJson(jsonString, YourDataModel.class);
2. 给TextView换上支持Emoji的字体
部分Android系统的默认字体不支持较新的Emoji(尤其是旧版本系统),这时候得给TextView配置支持Emoji的字体,推荐两种方案:
方案一:用官方EmojiCompat库(API 19+兼容)
这是Google官方推荐的方案,能自动适配系统字体缺失的Emoji:
- 先在build.gradle里添加依赖:
dependencies { implementation "androidx.emoji:emoji:1.2.0" implementation "androidx.emoji:emoji-appcompat:1.2.0" }
- 在Application的
onCreate()里初始化EmojiCompat:
@Override public void onCreate() { super.onCreate(); EmojiCompat.Config config = new FontRequestEmojiCompatConfig(this, new FontRequest( "com.google.android.gms.fonts", "com.google.android.gms", "Noto Color Emoji Compat", R.array.com_google_android_gms_fonts_certs )); EmojiCompat.init(config); }
- 布局里用
AppCompatTextView代替普通TextView:
<androidx.appcompat.widget.AppCompatTextView android:id="@+id/emoji_text_view" android:layout_width="wrap_content" android:layout_height="wrap_content"/>
方案二:引入第三方Emoji字体
如果不想用官方库,可以把支持Emoji的字体(比如Noto Color Emoji)放到assets/fonts目录,然后给TextView设置:
Typeface emojiTypeface = Typeface.createFromAsset(getAssets(), "fonts/NotoColorEmoji.ttf"); textView.setTypeface(emojiTypeface);
3. 检查文本转义是否正确
如果JSON里的Emoji是Unicode转义格式(比如\u1F600),解析后要确保正确转成对应的Emoji字符:
- 可以用Apache Commons Lang的
StringEscapeUtils工具类来解码:
String escapedEmoji = jsonObject.getString("emoji"); String decodedEmoji = StringEscapeUtils.unescapeJava(escapedEmoji); textView.setText(decodedEmoji);
- 不想引入第三方库的话,也可以自己实现简单的Unicode转义解析逻辑,不过用现成工具类更高效。
4. 旧版本Android的兼容方案(API < 19)
如果你的App需要支持API 19以下的系统,可以试试第三方库emoji-java,它能把Emoji转换成兼容的字符或图片:
String originalText = "Hello 😀"; String compatibleText = EmojiParser.parseToUnicode(originalText); textView.setText(compatibleText);
内容的提问来源于stack exchange,提问作者Pooja Pachchigar
相关产品推荐
相关产品推荐

