如何在Android字符串资源中使用UTF-16字符?

18

我希望在我的应用程序字符串中使用表情符号。所有字符串都存储在strings.xml文件中。

问题在于,并非所有表情符号都适用于16位。有些表情符号可以表示为“普通”的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中?

3个回答

12
但是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"

5
我试过直接的方法,但导致我的应用程序出现段错误。这就是为什么我开始寻找替代方案的原因 :-) 我会尝试其他选项。 - Shoham
2
我已经尝试了原始文本和运行时的😀,以及构建错误的��(“XML文件中出现错误:终止构建。”)。我认为你可以放心地提交一个缺陷报告,它是有效的。 - Mihai Nita
1
这在三星 S4 5.0.1 上崩溃了。 - Ernest Poletaev
示例Java代码:String grinningFaceEmoji = "\uD83D\uDE00"; - Mr-IDE
在这里,您可以将UTF16转换为2个UTF8字符:http://www.russellcottrell.com/greek/utilities/SurrogatePairCalculator.htm - Vlad

1
最简单的方法就是复制和粘贴表情符号,它适用于 Android Studio 3.0 及更新版本。

-8

按照以下方式添加资源:

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

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

Emoji

以下是它的展示效果:

Emoji


1
<U+1F642> 在资源文件中无效。 - friedger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接