转载请注明出处:
http://blog.csdn.net/u010811143

Emoji相关链接

  1. android 输入框EditText禁止输入Emoji表情符
  2. Android中过滤Emoji表情 完整版
  3. Unified Emoji表情for Android
  4. 彻底搞懂字符编码(unicode,mbcs,utf-8,utf-16,utf-32,big endian,little endian…)
  5. Emoji Unicode Tables

Emoji过滤方法

  1. 匹配Emoji表情列表过滤,需要得到Emoji表情列表
  2. 区间过滤,可能多过滤也肯少过滤

链接1:Emoji列表过滤,但是直接从 Emoji Unicode Tables 网站获取的列表 4. Enclosed characters ( 24C2 - 1F251 ) 区间会和汉字冲突,实际范围是 24C2 和(1F170 - 1F251),标题错了,作者没有修改直接把汉字内容(例如:我,们,有 ……)也过滤了,并且没有过滤 5. Uncategorized 忽略了许多表情。列表过滤相对准确,但是需要先加载列,虽然使用了静态方法但是首次使用要较长加载时间,过滤时匹配也相对耗时。

链接2:过滤区间,但是只过滤了双字节的Emoji表情,忽略了单字节的表情,并且区间也不合理(判断得很复杂,结果等同于直接过滤了 utf8 Surrogates,这样如果有其他的 Surrogates 区的编码字符也会被过滤掉)。相对列表过滤速度快,但存在多过滤和少过滤的较多。

综合两种情况考虑,既要保证速度又要保证过滤的准确性。Android EditView 以 UTF-16 为编码16位为一个单位。由于两字节以上的Unicode 编码基本上没用到,直接过滤掉 Surrogates 区(0xD800-0xDFFF);再过滤掉单字节的Emoji表情列表。

当然为了确保绝对只过滤Emoji表情,这里使用1的方法,修改了 4. Enclosed characters ( 24C2 - 1F251 ),添加了 5. Uncategorized ,毕竟现在Android的处理器性能都很高,效率可以不用考虑了。当然也可以使用区间过滤,添加个 Scrope ,再修改下filter()方法就行了,这里就不修改了。

import android.text.InputFilter;
import android.text.Spanned;import org.xutils.common.util.LogUtil;import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;/*** 过滤Emoji表情* Created by tutu on 2016/5/31.*/
public class EmojiFilter implements InputFilter {private static Set<String> filterSet = null;private static Set<Scope> scopeSet = null;/*** 区间类模型*/private class Scope {int start;int end;@Overridepublic boolean equals(Object o) {if (o instanceof Scope) {Scope scope = (Scope) o;if (scope.start == start && scope.end == end) {return true;}}return super.equals(o);}}private static void addUnicodeRangeToSet(Set<String> set, int start, int end) {if (set == null) {return;}if (start > end) {return;}for (int i = start; i <= end; i++) {filterSet.add(new String(new int[]{i}, 0, 1));}}private static void addUnicodeRangeToSet(Set<String> set, int code) {if (set == null) {return;}filterSet.add(new String(new int[]{code}, 0, 1));}static {filterSet = new HashSet<String>();scopeSet = new HashSet<>();// See http://apps.timwhitlock.info/emoji/tables/unicode// 1. Emoticons ( 1F601 - 1F64F )addUnicodeRangeToSet(filterSet, 0x1F601, 0X1F64F);// 2. Dingbats ( 2702 - 27B0 )addUnicodeRangeToSet(filterSet, 0x2702, 0X27B0);// 3. Transport and map symbols ( 1F680 - 1F6C0 )addUnicodeRangeToSet(filterSet, 0X1F680, 0X1F6C0);// 4. Enclosed characters ( 24C2 - 1F251 )addUnicodeRangeToSet(filterSet, 0X24C2);addUnicodeRangeToSet(filterSet, 0X1F170, 0X1F251);// 6a. Additional emoticons ( 1F600 - 1F636 )addUnicodeRangeToSet(filterSet, 0X1F600, 0X1F636);// 6b. Additional transport and map symbols ( 1F681 - 1F6C5 )addUnicodeRangeToSet(filterSet, 0X1F681, 0X1F6C5);// 6c. Other additional symbols ( 1F30D - 1F567 )addUnicodeRangeToSet(filterSet, 0X1F30D, 0X1F567);// 5. UncategorizedaddUnicodeRangeToSet(filterSet, 0X1F004);addUnicodeRangeToSet(filterSet, 0X1F0CF);// 与6c. Other additional symbols ( 1F30D - 1F567 )重复// 去掉重复部分虽然不去掉HashSet也不会重复,原范围(0X1F300 - 0X1F5FF)addUnicodeRangeToSet(filterSet, 0X1F300, 0X1F30D);addUnicodeRangeToSet(filterSet, 0X1F5FB, 0X1F5FF);addUnicodeRangeToSet(filterSet, 0X00A9);addUnicodeRangeToSet(filterSet, 0X00AE);addUnicodeRangeToSet(filterSet, 0X0023);//阿拉伯数字0-9,配合0X20E3使用//addUnicodeRangeToSet(filterSet, 0X0030, 0X0039);// 过滤掉203C开始后的2XXX 段落//addUnicodeRangeToSet(filterSet, 0X203C, 0X24C2);addUnicodeRangeToSet(filterSet, 0X203C);addUnicodeRangeToSet(filterSet, 0X2049);//严格验证的话需要判断前面是否是数字//Android上显示和数字分开可以不判断addUnicodeRangeToSet(filterSet, 0X20E3);addUnicodeRangeToSet(filterSet, 0X2122);addUnicodeRangeToSet(filterSet, 0X2139);addUnicodeRangeToSet(filterSet, 0X2194, 0X2199);addUnicodeRangeToSet(filterSet, 0X21A9, 0X21AA);addUnicodeRangeToSet(filterSet, 0X231A, 0X231B);addUnicodeRangeToSet(filterSet, 0X23E9, 0X23EC);addUnicodeRangeToSet(filterSet, 0X23F0);addUnicodeRangeToSet(filterSet, 0X23F3);addUnicodeRangeToSet(filterSet, 0X25AA, 0X25AB);addUnicodeRangeToSet(filterSet, 0X25FB, 0X25FE);//TODO: 26XX 太杂全部过滤addUnicodeRangeToSet(filterSet, 0X2600, 0X26FE);addUnicodeRangeToSet(filterSet, 0X2934, 0X2935);addUnicodeRangeToSet(filterSet, 0X2B05, 0X2B07);addUnicodeRangeToSet(filterSet, 0X2B1B, 0X2B1C);addUnicodeRangeToSet(filterSet, 0X2B50);addUnicodeRangeToSet(filterSet, 0X2B55);addUnicodeRangeToSet(filterSet, 0X3030);addUnicodeRangeToSet(filterSet, 0X303D);addUnicodeRangeToSet(filterSet, 0X3297);addUnicodeRangeToSet(filterSet, 0X3299);}public EmojiFilter() {super();}@Overridepublic CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart,int dend) {// check black-list setfor (int i = 0; i < source.length(); i++) {LogUtil.e(Integer.toHexString(source.charAt(i)));}LogUtil.e(source.toString() + " length: " + source.toString().length() +" ;bytes length: " + source.toString().getBytes().length);
//        Iterator<String> iterator = filterSet.iterator();
//        while (iterator.hasNext()) {//            String filter = iterator.next();
//            if (filter.equals(source.toString())) {//                LogUtil.e(filter + " length: " + filter.length() +
//                        " ;bytes length: " + filter.getBytes().length);
//                for (int i= 0; i < source.length(); i++){//                    LogUtil.e(Integer.toHexString(source.charAt(i)));
//                }
//                return "";
//            }
//        }if (filterSet.contains(source.toString())) {return "";}return source;}}

吐槽

小日本真能折腾,没事搞什么Emoji

Android 准确过滤(禁止) Emoji表情相关推荐

  1. 【Android】显示Emoji表情字符

    一.下载AndroidEmoji.ttf字体 地址1:Github Android Platform 地址2:AndroidEmoji.ttf.zip 二.使用 2.1 将字体拷贝到assets/fo ...

  2. Android IOS风格Emoji表情,简单实用

    相信大家做项目的时候,特别是聊天相关的,一般都需要用到Emoji. 但是Emoji表情在安卓和IOS两个平台上,显示效果是不一样的,如下图: 言归正传,大家都知道,Emoji就是一组Unicode编码 ...

  3. 修改Android手机的emoji表情(NotoColorEmoji.ttf)

    过程综述 1.Android手机需要root,因为需要访问/system/fonts/NotoColorEmoji.ttf修改 2.需要NotoColorEmoji.ttf对应的库,比如你想要修改成i ...

  4. oracle存储emoji表情,Android自带emoji表情的使用方法详解

    什么是emoji表情 emoji表情是一种表情符号,在代码中它现在其实是一组遵循Unicode的编码,即每一个表情符号都对应了一个Unicode编码.更进一步说,emoji表情实际上是一组Unicod ...

  5. iOS禁止输入emoji表情

    因为emoji编码在android或者pc设备没有很好的支持,所以有时候为了禁止emoji表情的输入,因为关闭不了系统emoji的键盘,那只能根据编码把emoji表情过滤掉,写了一个NSString的 ...

  6. android EditText完美解决禁止输入法表情

    最近有个需求,需要评论的时候禁止输入法的表情输入.然后在网上各种找,发现有些人啊,也是服了,同样的东西反复写,并且还没解决问题,我就想问问,这个你们自己真的动手运行的了,效果实现了吗,还是说,效果实现 ...

  7. Android Emoji表情开发。两端使同一套的图片,防止两端因为系统内置的Emoji表情不一样,而造成用户体验不一致!

    一.前言 这两天在做Emoji表情开发,查查了资料,这让我知道如果没有规则是多么一件可怕的事情,正常Emoji应该是同一套的编码才对,但是发现Android IOS 上虽然编码是一致的但是Emoji表 ...

  8. Android自带的emoji表情的使用

    原文链接:http://www.itwendao.com/article/detail/53941.html 什么是emoji表情 emoji表情是一种表情符号,在代码中它现在其实是一组遵循Unico ...

  9. android 调出键盘表情_Android 软键盘和emoji表情切换方案,和微信几乎一样的体验...

    注意:本项目还有一个小坑.第一次进去的时候有时候输入框没有得到焦点,没有弹出软键盘,所以不能更好的量取软键盘高度,给了一个默认值787 软键盘默认高度.所以可以忽略不计,一旦弹出了软键盘,这个高度就被 ...

  10. android 过滤emoji表情符号,android怎样过滤字符串中的emoji表情

    满意答案 jdubysct 2016.03.15 采纳率:43%    等级:8 已帮助:863人 解决方案 对于字符串处理,首选就是正则表达式去处理,而在android系统中可以自定义InputFi ...

最新文章

  1. 用sublime server 启动本地服务器(手机访问电脑页面)
  2. donsker定理_中心极限定理和Donsker定理
  3. IDEA 搭建 maven(1)
  4. 项目管理的十大谈判必杀技
  5. C#LeetCode刷题之#104-二叉树的最大深度​​​​​​​(Maximum Depth of Binary Tree)
  6. 资源日历 踩坑记(二)
  7. Android Pie(Android 9)跳过 Google 框架 (GApps) 开机验证方法
  8. 本地mongo 连接远程数据库_本地搭建esaymock
  9. ··· Socks Online - 在内部网也能使用QQ ···
  10. U盘强制格式化的解决方案
  11. Java目前主流框架
  12. laravel安装barryvdh/laravel-snappy 笔记
  13. 在arcengine中实现图片预览
  14. 计算机性能指标的类型,电脑显示器的分类, 性能指标介绍
  15. steps_per_epoch=2000,epochs=100之间的区别
  16. 如何安装Windows操作系统
  17. php取word表格一行内容,如何提取出word表格中的内容 值得一看
  18. 和菜头翻译 如何不靠运气致富
  19. tomcat 7.0
  20. ural 1998 The old Padawan (模拟+二分)

热门文章

  1. 七种常用数据分析方法
  2. 数据库设计之需求分析
  3. oracle 授权所有语句,oracle grant 授权语句
  4. dell电脑恢复出厂系统(旧电脑如何重装系统)
  5. YS-F4Pro开发板第四章:开发环境搭建【IAR和KEIL区别】【cube软件】【ST-Link和Jlink】
  6. 什么是DDD(领域驱动设计)?
  7. 计算机组装与维目实训内容,计算机组装与维实训报告书(原版).doc
  8. ADMM 大规模变量优化
  9. 京东登录界面html css,css制作京东登录页面 css样式,京东店面装修怎么写CSS样式?...
  10. AUC评价指标的理解以及其为何能衡量二分类模型优劣——复习篇