项目中我们通常可以通过第三方输入法项Android文本框中输入表情符号,但是后台解析时可能会报错,所以通常我们都会屏蔽掉EditText的表情符号输入。下面介绍一下自己为了解决这个问题爬过的坑。
第一种解决方案(错误的):
public boolean isEmojiCharacter(char codePoint) { return !((codePoint == 0x0) || (codePoint == 0x9) || (codePoint == 0xA) || (codePoint == 0xD) || ((codePoint >= 0x20) && codePoint <= 0xD7FF)) || ((codePoint >= 0xE000) && (codePoint <= 0xFFFD)) || ((codePoint >= 0x10000) && (codePoint <= 0x10FFFF)); }
通过这种方法判断输入的字符是否是表情符号确实可以达到目的,但也会带来其他问题。经过测试,EditText确实不能输入表情符号了,但是输入中文逗号的时候回删除前面的一个字符(如果前面有字符的话),所以最后放弃了这种方法。
第二种解决方案(错误的):
使用正则表达式,代码如下
public static boolean isEmote(String content) { String NOT_EMOJI = "[\ud83c\udc00-\ud83c\udfff]|[\ud83d\udc00-\ud83d\udfff]|[\u2600-\u27ff]"; Pattern pattern = Pattern.compile(NOT_EMOJI); Matcher matcher = pattern.matcher(content); return matcher.find(); }
经测试,这种方法能过滤到多数表情符号,但不是全部的,所以这种方法也放弃了。
第三种解决方案(目前为止没测出来bug):
使用InputFilter,代码如下
InputFilter EMOJI_FILTER = new InputFilter() { @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { for (int index = start; index < end; index++) { int type = Character.getType(source.charAt(index)); if (type == Character.SURROGATE) { return ""; } } return null; } };
这种方法涉及到Unicode编码,今后有时间会做进一步研究,如果发现有bug或者发现更好的方法也会对本文进行更新。
参考地址:http://blog.csdn.net/zahuopuboss/article/details/52222667