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

Android多语言选择弹窗显示???乱码问题求助

解决AlertDialog多语言文字乱码(显示???)的问题

看起来你遇到的是非ASCII字符在AlertDialog中显示乱码的问题,这在Android开发里很常见,主要是直接硬编码多语言字符串或源文件编码配置不当导致的。下面给你几个靠谱的解决办法:

1. 优先使用Android多语言资源文件(推荐)

Android官方强烈建议不要在代码里硬编码多语言字符串,而是通过res/values-xx目录下的资源文件管理,这不仅能彻底避免乱码,还能更好地支持系统语言切换逻辑。

操作步骤:

  • 先在res/values目录的strings.xml中添加默认语言选项:
<resources>
    <string name="choose_language">Choose a language</string>
    <string name="lang_english">English</string>
    <string name="lang_spanish">Español (Spanish)</string>
    <string name="lang_french">Français (French)</string>
    <string name="lang_russian">Русский язык (Russian)</string>
    <string name="lang_arabic">العربية (Arabic)</string>
    <string name="lang_chinese_simplified">简体中文 (Simplified Chinese)</string>
</resources>
  • 针对不同语言创建对应资源目录(比如俄语用res/values-ru、阿拉伯语用res/values-ar、简体中文用res/values-zh-rCN),在各目录的strings.xml中翻译对应字段。(如果只是要在对话框显示选项,至少保证默认strings.xml的字符编码正确)

  • 修改你的AskForLanguage()方法,从资源文件读取字符串:

void AskForLanguage() {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle(getString(R.string.choose_language));
    
    final String[] arrsLanguages = {
        getString(R.string.lang_english),
        getString(R.string.lang_spanish),
        getString(R.string.lang_french),
        getString(R.string.lang_russian),
        getString(R.string.lang_arabic),
        getString(R.string.lang_chinese_simplified)
    };
    
    builder.setSingleChoiceItems(arrsLanguages, 0, (dialog, which) -> {
        // 这里添加你的语言选择处理逻辑
        dialog.dismiss();
    });
    
    builder.show();
}

2. 修复Java源文件的编码格式

如果坚持要硬编码字符串(不推荐),得确保你的Java源文件编码是UTF-8——Android Studio默认编码配置不当的话,非ASCII字符会被错误存储,运行时就会解析失败。

操作步骤:

  • 打开Android Studio的File > Settings > Editor > File Encodings
  • 将IDE Encoding和Project Encoding都设置为UTF-8
  • 勾选Transparent native-to-ascii conversion选项,让AS自动处理非ASCII字符的转义
  • 重新写入或粘贴那些多语言文本

3. 检查AlertDialog的字体支持

少数情况下,系统默认字体可能不支持某些语言的特殊字符(比如阿拉伯语的右到左字符、俄语的西里尔字母),这时可以给AlertDialog设置支持多语言的字体:

示例代码:

// 从assets目录加载支持多语言的字体(比如Noto Sans)
Typeface multiLangFont = Typeface.createFromAsset(getAssets(), "fonts/NotoSans.ttf");

// 创建对话框后,为标题和选项列表设置字体
AlertDialog dialog = builder.create();
dialog.setOnShowListener(d -> {
    ListView listView = dialog.getListView();
    for (int i = 0; i < listView.getChildCount(); i++) {
        TextView textView = (TextView) listView.getChildAt(i);
        textView.setTypeface(multiLangFont);
    }
    TextView titleView = dialog.findViewById(android.R.id.title);
    if (titleView != null) {
        titleView.setTypeface(multiLangFont);
    }
});
dialog.show();

推荐用谷歌的Noto Sans字体,它支持几乎所有主流语言的字符集。

为什么会出现????

当Android无法识别某个字符的编码,或者该字符不在当前字体的字符集中时,就会用???替代。硬编码非ASCII字符时,如果源文件编码不是UTF-8,这些字符会被错误存储,运行时自然无法正确解析。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:26:50