emoji表情过滤——识别4字节UTF8

常用的utf8编码,最多只会达到3字节,如MySQL的utf8编码。但像emoji表情等Unicode是4字节的(UCS-4),在编码为utf8时,也会占用4字节。在MySQL中,就要使用utf8mb4(most bytes 4)编码,否则插入时会报错。
  在某些场景下,我们并不希望文本中出现emoji表情等非常用字符,那么如何过滤呢?其实有一个简单的方式,我们可以看一下UTF8的编码规则,见下图。


注意红框,当出现4字节的utf8编码时,其高位一定是“11110xxx”,这就可以利用其“高4位全1”的特性来进行判断。代码如下:
    private static final byte UTF8_HIGH_MASK = (byte)0xf0;

    public static Boolean has4BytesUTF8(String str){
        if(StringUtils.isBlank(str)){
            return false;
        }

        try {
            byte[] bytes = str.getBytes("UTF8");
            for(byte b : bytes){
                if(((byte)(b&UTF8_HIGH_MASK))==UTF8_HIGH_MASK){
                    return true;
                }
            }
            return false;
        } catch (UnsupportedEncodingException e) {
            return false;
        }
    }
代码上有可优化之处,比如不必遍历所有字节,可以根据字节高位的pattern,一次跳过多个字节。

本文来自网易实践者社区,经作者程义授权发布。