我正在使用上面的代码显示一些包含EditText
中表情符号的文字:
EditText et = (EditText) findViewById(R.id.myeditext);
et.setText(StringEscapeUtils.unescapeJava("This is a text with emoji \u263A"));
这显示了我写的文字和一个笑脸图释或某事。
但是如果我添加了另一个值而不是\u263A
,例如\u1F60A
,则它不起作用。它显示的问题就像这个问题中的图像一样:
Unicode character (U+1FXYZ) not outputting correctly when used in code-behind
有谁知道如何处理这个问题? 谢谢。
更新
当包含unicodes的字符串是随机的时,我如何使用下面给出的答案,甚至是假定的重复问题中给出的答案?
这是我想要实现的伪代码:
for ( eachFbComment as (String) randomString ) {
//randomString example: "This is a text with emoji \u263A, string countinues here with another emoji \u1F60A, and a last emoji here \u263A! "
print (randomString); // Here I want to display the text + emojis instead of unicode characters.
}
答案 0 :(得分:1)
\uXXXX
用于4个十六进制数字,16位Unicode。一些(不是java)语言使用大写\UXXXXXXXX
(\U0001F60A
)。您可以使用:
String emoji = new String(new int[] { 0x1F60A }, 0, 1);
这使用只有一个代码点的代码点数组。
et.setText("This is a text with emoji " + emoji);
是否显示表情符号取决于字体。
有问题的更新后:
大小写:字符串包含反斜杠,'u'和4到5个十六进制数字。
String s = "This is with \\u263A, continuing with another \\u1F60A, and \\u263A!";
请注意,在java "\u1F60A"
中,'\u1F60'
和'A'
会有两个代码点。所以上面是一个自制的约定,就像java的u-escaping类似。人们可以看到原始的\u1F60A
。
将s
翻译成完整的Unicode字符串:
Pattern pattern = Pattern.compile("\\\\u([0-9A-Fa-f]{4,5})\\b");
StringBuffer sb = new StringBuffer();
Matcher m = pattern.matcher(s);
while (m.find()) {
int cp = Integer.parseInt(m.group(1), 16);
String added = cp < 0x10000
? String.valueOf((char) cp)
: new String(new int[] { cp }, 0, 1);
m.appendReplacement(sb, added);
}
m.appendTail(sb);
s = sb.toString();