EditText过滤表情符号

项目中我们通常可以通过第三方输入法项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

转载于:https://my.oschina.net/u/3166028/blog/1592503

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值