我正在开发Android应用,我不希望人们在输入中使用表情符号。
如何从字符串中删除表情符号字符?
答案 0 :(得分:18)
Emojis可以在以下范围内找到(source):
您可以在脚本中使用此行一次过滤所有内容:
text.replace("/[\u2190-\u21FF]|[\u2600-\u26FF]|[\u2700-\u27BF]|[\u3000-\u303F]|[\u1F300-\u1F64F]|[\u1F680-\u1F6FF]/g", "");
答案 1 :(得分:4)
最新的表情符号数据可在此处找到:
http://unicode.org/Public/emoji/
有一个以emoji版本命名的文件夹。 作为应用程序开发人员,最好使用最新版本。
当您查看文件夹内部时,您会看到其中的文本文件。 你应该检查emoji-data.txt。它包含所有标准的表情符号代码。
表情符号有很多小的符号代码范围。 最好的支持是在你的应用程序中检查所有这些。
有些人问为什么我们只能在\ u之后指定4个数字代码。 那么这些是由代理对制成的代码。通常使用2个符号来编码一个表情符号。
例如,我们有一个字符串。
String s = ...;
UTF-16表示
byte[] utf16 = s.getBytes("UTF-16BE");
迭代UTF-16
for(int i = 0; i < utf16.length; i += 2) {
获取一个字符
char c = (char)((char)(utf16[i] & 0xff) << 8 | (char)(utf16[i + 1] & 0xff));
现在检查代理对。表情符号位于第一个平面上,因此请检查对的第一部分,范围为0xd800..0xd83f。
if(c >= 0xd800 && c <= 0xd83f) {
high = c;
continue;
}
代理对范围的第二部分是0xdc00..0xdfff。我们现在可以将一对转换为一个5位数代码。
else if(c >= 0xdc00 && c <= 0xdfff) {
low = c;
long unicode = (((long)high - 0xd800) * 0x400) + ((long)low - 0xdc00) + 0x10000;
}
所有其他符号都不是对,因此按原样处理。
else {
long unicode = c;
}
现在使用emoji-data.txt中的数据来检查它是否是表情符号。 如果是,则跳过它。如果没有,则将字节复制到输出字节数组。
最后,字节数组通过
转换为StringString out = new String(outarray, Charset.forName("UTF-16BE"));
答案 2 :(得分:1)
这是我用来删除表情符号的内容。注意:这仅适用于API 24和转发
public String remove_Emojis_For_Devices_API_24_Onwards(String name)
{
// we will store all the non emoji characters in this array list
ArrayList<Character> nonEmoji = new ArrayList<>();
// this is where we will store the reasembled name
String newName = "";
//Character.UnicodeScript.of () was not added till API 24 so this is a 24 up solution
if (Build.VERSION.SDK_INT > 23) {
/* we are going to cycle through the word checking each character
to find its unicode script to compare it against known alphabets*/
for (int i = 0; i < name.length(); i++) {
// currently emojis don't have a devoted unicode script so they return UNKNOWN
if (!(Character.UnicodeScript.of(name.charAt(i)) + "").equals("UNKNOWN")) {
nonEmoji.add(name.charAt(i));//its not an emoji so we add it
}
}
// we then cycle through rebuilding the string
for (int i = 0; i < nonEmoji.size(); i++) {
newName += nonEmoji.get(i);
}
}
return newName;
}
所以如果我们传入一个字符串:
remove_Emojis_For_Devices_API_24_Onwards(“测试指标:ढ日语:な韩语:ㅂ”);
它返回:测试印度:ढ日语:な韩语:ㅂ
表情符号放置或计数无关紧要
答案 3 :(得分:1)
对于使用Kotlin的用户,Char.isSurrogate也可以提供帮助。查找并从中删除正确的索引。