Android中过滤Emoji表情 完整版

实际上和Android也没太多关系,主要是数据库没有升级,导致没法存储emoji。另外即使存储了,在其他设备上也不一定能展示出来,所以干脆就过滤掉。

这个与Android无太大关系,主要是获取Emoji表情的unicode范围,不查不知道,一查吓一跳,尼玛这么多。。。网上给出的其他方案,大体上都是选了一个大概的区间,可能会多过滤,也可能漏掉不少。

见这个网址。

http://apps.timwhitlock.info/emoji/tables/unicode

下面是代码,我这里直接用了Unicode表示并转换为UTF8字符。如果你比较好学的话,点开链接,还能发现utf8 Surrogates,这个是两个utf8字符都是满2字节的时候可以这么写"D83D DE01",好了,代码如下。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
import android.text.InputFilter;
import android.text.Spanned;
import java.util.HashSet;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Created by coder4 on 15/11/18.
*/
public class EmojiFilter implements InputFilter {
private static Set<String> filterSet = null;
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));
}
}
static {
filterSet = new HashSet<String>();
// See http://apps.timwhitlock.info/emoji/tables/unicode
// 1F601 - 1F64F
addUnicodeRangeToSet(filterSet, 0x1F601, 0X1F64F);
// 2702 - 27B0
addUnicodeRangeToSet(filterSet, 0x2702, 0X27B0);
// 1F680 - 1F6C0
addUnicodeRangeToSet(filterSet, 0X1F680, 0X1F6C0);
// 24C2 - 1F251
addUnicodeRangeToSet(filterSet, 0X24C2, 0X1F251);
// 1F600 - 1F636
addUnicodeRangeToSet(filterSet, 0X1F600, 0X1F636);
// 1F681 - 1F6C5
addUnicodeRangeToSet(filterSet, 0X1F681, 0X1F6C5);
// 1F30D - 1F567
addUnicodeRangeToSet(filterSet, 0X1F30D, 0X1F567);
// not included 5. Uncategorized
}
public EmojiFilter() {
super();
}
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart,
int dend) {
// check black-list set
if (filterSet.contains(source.toString())) {
return "";
}
return source;
}
}
import android.text.InputFilter; import android.text.Spanned; import java.util.HashSet; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Created by coder4 on 15/11/18. */ public class EmojiFilter implements InputFilter { private static Set<String> filterSet = null; 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)); } } static { filterSet = new HashSet<String>(); // See http://apps.timwhitlock.info/emoji/tables/unicode // 1F601 - 1F64F addUnicodeRangeToSet(filterSet, 0x1F601, 0X1F64F); // 2702 - 27B0 addUnicodeRangeToSet(filterSet, 0x2702, 0X27B0); // 1F680 - 1F6C0 addUnicodeRangeToSet(filterSet, 0X1F680, 0X1F6C0); // 24C2 - 1F251 addUnicodeRangeToSet(filterSet, 0X24C2, 0X1F251); // 1F600 - 1F636 addUnicodeRangeToSet(filterSet, 0X1F600, 0X1F636); // 1F681 - 1F6C5 addUnicodeRangeToSet(filterSet, 0X1F681, 0X1F6C5); // 1F30D - 1F567 addUnicodeRangeToSet(filterSet, 0X1F30D, 0X1F567); // not included 5. Uncategorized } public EmojiFilter() { super(); } @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { // check black-list set if (filterSet.contains(source.toString())) { return ""; } return source; } }
import android.text.InputFilter;
import android.text.Spanned;

import java.util.HashSet;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Created by coder4 on 15/11/18.
 */
public class EmojiFilter implements InputFilter {

    private static Set<String> filterSet = null;

    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));
        }
    }

    static {
        filterSet = new HashSet<String>();

        // See http://apps.timwhitlock.info/emoji/tables/unicode

        // 1F601 - 1F64F
        addUnicodeRangeToSet(filterSet, 0x1F601, 0X1F64F);

        // 2702 - 27B0
        addUnicodeRangeToSet(filterSet, 0x2702, 0X27B0);

        // 1F680 - 1F6C0
        addUnicodeRangeToSet(filterSet, 0X1F680, 0X1F6C0);

        // 24C2 - 1F251
        addUnicodeRangeToSet(filterSet, 0X24C2, 0X1F251);

        // 1F600 - 1F636
        addUnicodeRangeToSet(filterSet, 0X1F600, 0X1F636);

        // 1F681 - 1F6C5
        addUnicodeRangeToSet(filterSet, 0X1F681, 0X1F6C5);

        // 1F30D - 1F567
        addUnicodeRangeToSet(filterSet, 0X1F30D, 0X1F567);

        // not included 5. Uncategorized

    }

    public EmojiFilter() {
        super();
    }

    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart,
            int dend) {
        // check black-list set
        if (filterSet.contains(source.toString())) {
            return "";
        }
        return source;
    }

}

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *