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

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:

  1. 先在build.gradle里添加依赖:
dependencies {
    implementation "androidx.emoji:emoji:1.2.0"
    implementation "androidx.emoji:emoji-appcompat:1.2.0"
}
  1. 在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);
}
  1. 布局里用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:23:49