【问题标题】:How can I put utf-16 characters in Android string resource?如何将 utf-16 字符放入 Android 字符串资源中?
【发布时间】:2026-02-17 15:20:05
【问题描述】:

我想在我的应用字符串中使用表情符号。当然,所有字符串都驻留在 strings.xml 中

问题在于并非所有表情符号都是 16 位友好的。一些 Emoji 可以表示为“普通”16 位十六进制:'\u26FF',但有些是 32 位十六进制 (UTF-16),通常表示为:'\x1F600'。在代码中处理应用程序内部的那些我没有问题。但是 strings.xml 资源文件是 UTF8 编码的,不能正确处理非 16 位转义字符。

我尝试使用 '\x1F600' - 因为我看到 '\u26FF' 工作得很好。但它似乎不会吞噬“x”转义字符。也不像正则表达式 '\x{1F600}'

所以我最终使用了一个字符串占位符 '%1$s' 并在代码中填写表情符号,如下所示:

// greeting_3 is defined as: "hello there %1$s!"
String s = context.getString(R.string.greeting_3, "????");
// OR:
String s = context.getString(R.string.greeting_3, new String(Character.toChars(0x1F61C)));

这不是一个非常优雅的解决方案...有没有合适的方法将 32 位 UTF-8 字符放入 strings.xml 中?

【问题讨论】:

    标签: android xml string utf-8 emoji


    【解决方案1】:

    但是strings.xml资源文件是UTF8的

    如果是 UTF-8 编码的,你可以直接放你的表情符号。但是,您的编辑器或其他软件可能会破坏它们。

    如果您将它们放在 XML 中,您可以尝试使用 XML 实体:😀,不过我不确定 Android 对它们的支持程度。

    您还可以使用代理对:将表情符号转换为 UTF-16 并使用标准 \u 转义。例如,您可以查看此页面,它甚至告诉您如何在 Java 中创建字符串文字:http://www.fileformat.info/info/unicode/char/1F600/index.htm

    ? → U+1F600 → "\uD83D\uDE00"

    【讨论】:

    • 我尝试了直接方式,但它导致我的应用程序出现段错误。这就是我开始寻找替代品的原因 :-) 我会尝试其他选择。
    • 我已经尝试过原始文本和 😀在运行时出现段错误,并且 出现构建错误(“XML 文件中的错误:正在中止构建。”)。我认为您可以安全地提交错误,它是有效的。
    • 这在三星 S4 5.0.1 上崩溃了
    • Java 代码示例:String grinningFaceEmoji = "\uD83D\uDE00";
    • 这里可以将utf16转换为2个utf8字符russellcottrell.com/greek/utilities/SurrogatePairCalculator.htm
    【解决方案2】:

    复制和粘贴表情符号的最简单方法,适用于 Android Studio 3.0 及更高版本

    【讨论】:

      【解决方案3】:

      添加资源如下:

      <string name="string_title">This is a emoji example <U+1F642></string>
      

      在 Android Studio 3.0 中,您可以复制和粘贴表情符号:

      它的外观如下:

      【讨论】:

      • 在资源文件中无效