Android - 如何从字符串中过滤表情符号(表情符号)?

Joc*_*ers 6 android emoji

我正在开发Android应用程序,我不希望人们在输入中使用表情符号.

如何从字符串中删除表情符号字符?

小智 18

Emojis可以在以下范围内找到(来源):

  • U + 2190到U + 21FF
  • U + 2600到U + 26FF
  • U + 2700到U + 27BF
  • U + 3000到U + 303F
  • U + 1F300至U + 1F64F
  • U + 1F680至U + 1F6FF

您可以在脚本中使用此行一次过滤所有内容:

text.replace("/[\u2190-\u21FF]|[\u2600-\u26FF]|[\u2700-\u27BF]|[\u3000-\u303F]|[\u1F300-\u1F64F]|[\u1F680-\u1F6FF]/g", "");

  • @ user210504它处理的是什么情况?如果您没有示例,说"这不能处理所有情况"是没有用的. (15认同)
  • 不工作.最后我使用了https://github.com/vdurmont/emoji-java.例如,删除所有表情符号:EmojiParser.removeAllEmojis(text); (3认同)
  • \u 需要 4 位数字——这应该如何用于 1f300 等? (2认同)

小智 6

对于那些使用 Kotlin 的人,Char.isSurrogate也可以提供帮助。从中查找并删除正确的索引。


NoA*_*gel 5

最新的表情符号数据可以在这里找到:

http://unicode.org/Public/emoji/

有一个以表情符号版本命名的文件夹。作为应用程序开发人员,一个好主意是使用可用的最新版本。

当您查看文件夹内部时,您会在其中看到文本文件。您应该检查emoji-data.txt。它包含所有标准表情符号代码。

表情符号有很多小的符号代码范围。最好的支持将是在您的应用程序中检查所有这些。

有人问为什么我们只能在\ u后指定4,所以为什么会有5位数字代码。这些都是由代理对组成的代码。通常使用2个符号来编码一个表情符号。

例如,我们有一个字符串。

String s = ...;
Run Code Online (Sandbox Code Playgroud)

UTF-16表示

byte[] utf16 = s.getBytes("UTF-16BE");
Run Code Online (Sandbox Code Playgroud)

遍历UTF-16

for(int i = 0; i < utf16.length; i += 2) {
Run Code Online (Sandbox Code Playgroud)

得到一个字符

char c = (char)((char)(utf16[i] & 0xff) << 8 | (char)(utf16[i + 1] & 0xff));
Run Code Online (Sandbox Code Playgroud)

现在检查代理对。表情符号位于第一平面上,因此请检查对的第一部分,范围为0xd800..0xd83f。

if(c >= 0xd800 && c <= 0xd83f) {
    high = c;
    continue;
}
Run Code Online (Sandbox Code Playgroud)

对于代理对的第二部分,范围是0xdc00..0xdfff。现在我们可以将一对转换为一个5位代码。

else if(c >= 0xdc00 && c <= 0xdfff) {
    low = c;
    long unicode = (((long)high - 0xd800) * 0x400) + ((long)low - 0xdc00) + 0x10000;
}
Run Code Online (Sandbox Code Playgroud)

所有其他符号不是成对的,因此请按原样处理它们。

else {
    long unicode = c;
}
Run Code Online (Sandbox Code Playgroud)

现在使用emoji-data.txt中的数据检查它是否是emoji。如果是,则跳过它。如果没有,则将字节复制到输出字节数组。

最后字节数组通过以下方式转换为String

String out = new String(outarray, Charset.forName("UTF-16BE"));
Run Code Online (Sandbox Code Playgroud)