【问题标题】:Android some unicode values (emoticons) not recognized [duplicate]Android无法识别一些unicode值(表情符号)[重复]
【发布时间】:2016-06-14 12:24:04
【问题描述】:

我正在使用上面的这段代码在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.
}

【问题讨论】:

  • 您在链接的帖子中没有找到答案吗?
  • 你是认真的吗?您已经通过上面的链接回答了您的问题。搜索堆栈溢出可以在 10 秒内为您提供 java 的答案:stackoverflow.com/questions/9834964/…
  • @chuhx 查看更新。
  • @user1992 请给出一个清晰的例子来说明“unicodes 是随机的”是什么意思。很不清楚你在这里的意思。 unicode如何随机?是用户输入的吗?它是从表情符号列表中选择的吗?请展示一个具有代表性的示例,准确地展示您想要完成的工作。
  • @MichaelGaskill 我没有说 unicode 是随机的,但包含 unicodes 的字符串是随机的。例如,如果我想显示 Facebook 帖子中的 cmets。这些 cmets 包含可能包含表情符号的随机字符串。在这种情况下,假设我有获得这些 cmets 所需的机制,当 unicode 是更通用字符串的一部分时,我该如何使用下面给出的答案?如何以接受的答案中描述的方式转换任何单个 unicode?谢谢。

标签: java android unicode emoticons


【解决方案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的unicode 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();

【讨论】:

  • 它可以工作,但是当文本是随机的,没有像上面那样明确给出时,我怎么能做到这一点。如何使用随机文本执行此操作。我的意思是如何在我不知道它包含什么的文本中将\uXXXX 表示为0xXXXX
  • Java 在内部将文本保存为 Unicode,因此唯一的问题是输入文件(= 二进制数据)。文本文件必须是 Unicode 格式,如 UTF-8,然后在 java 中的读取应指定“UTF-8”。编辑没有问题(在编程方面)。
  • 谢谢你,但我想你错过了理解我的评论。这是一个更好的解释:“例如,如果我想显示 Facebook 帖子中的 cmets。这些 cmets 包含可能包含表情符号的随机字符串。在这种情况下,假设我有获得这些所需的机制cmets,当 unicode 是更通用字符串的一部分时,我如何使用下面给出的答案?如何以接受的答案中描述的方式转换任何单个 unicode?"
  • 您能帮我更清楚地理解这个问题吗?所以你有一个带有表情符号的字符串(真正的 Unicode 代码点,如 U+1F60A)。你想找到表情符号吗? str.codePoints.filter((cp) -&gt; Character.UnicodeBlock.of(cp).equals(Character.UnicodeBlock.EMOTICONS))).count() 之类的。
  • 请看问题更新,有我想做的伪代码。希望现在更清楚了,谢谢!
猜你喜欢
  • 2020-10-12
  • 2020-07-06
  • 2021-10-02
  • 2018-03-10
  • 2019-01-24
  • 1970-01-01
  • 2021-02-11
  • 1970-01-01
  • 2016-12-31
相关资源
最近更新 更多