过滤文本或字符串中的emoji表情(包括微信自带表情处理)

过滤字符串中的emoji表情

网上搜索了很久,都没有一个很好的解决方案,经过多方查证和测试,有了自己的处理方案,写出来分享一下。

问题重点

  1. 微信聊天记录中,微信自带表情会变成[微笑] [握手]等格式,如何判断出字符串中该类表情以及如何去除
  2. 对于emoji表情,字符串中是一个小方块,如何筛选与判断

实现效果

	public static void main(String[] args) {
		String str = "[微笑]][[好\uD83D\uDC4C的[握拳]";
        System.out.println(removeEmoji(str));
    }

在这里插入图片描述
因为emoji是Unicode格式,java语言中是不可见的,所以粘贴出来就是一串Unicode码,而看上去会是一个方框,数据库中也一样。
mongodb中的样子:
在这里插入图片描述
复制后放入java中的样子和输出后的样子:
在这里插入图片描述
标准的emoji都可以通过下面引入的包进行操作,但微信自带的就不好处理了

依赖jar包 阿里云maven库 central

		<!--   java emoji表情库     -->
        <dependency>
            <groupId>com.vdurmont</groupId>
            <artifactId>emoji-java</artifactId>
            <version>5.1.1</version>
        </dependency>

该包是github上一个开源的用于处理emoji表情的包。可以判断是否是emoji,字符串中是否存在emoji等很多实用方法,具体内容请看:com.vdurmont介绍

emoji介绍

emoji表情其实就是unicode码,Unicode(又称统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发,1994年正式公布。更多介绍详见度娘

实现代码

 	/**
     * 判断消息是否是emoji表情
     *
     * @param text:要判断的文本
     * @return: boolean
     * @author jo.li
     * @description isEmojiByText <br/>
     * @date 2020/12/21 13:34
     **/
    static boolean isEmojiByText(String text) {
        if (StringUtils.isBlank(text)) {
            return true;
        }
        if (StringUtils.isBlank(removeEmoji(text))) {
            return true;
        } else {
            return false;
        }
    }
	/**
     * 去除文本中的emoji表情,并返回剩余内容
     *
     * @param text:原文本
     * @return: java.lang.String
     * @author jo.li
     * @description removeEmoji <br/>
     * @date 2020/12/24 13:26
     **/
    static String removeEmoji(String text) {
        if (StringUtils.isBlank(text)) {
            return text;
        }
        // 去除微信自带表情如[微笑] 如果不存在则返回原文
        text = removeWeChatEmoji(text);
        // 判断是否存在unicode格式的emoji表情
        if (EmojiManager.containsEmoji(text)) {
        	// 去除字符串中的所有unicode格式的emoji表情
            return EmojiParser.removeAllEmojis(text);
        }
        return text;
    }

    /**
     * 递归删除微信文字表情 如[微笑]表情
     *
     * @param str:文本
     * @return: java.lang.String
     * @author jo.li
     * @description removeWeChatEmoji <br/>
     * @date 2020/12/24 15:48
     **/
    static String removeWeChatEmoji(String str) {
        String emoji = recursionSplitStr(str);
        if (StringUtils.isNotBlank(emoji)) {
            // 表情在文本中的结尾位置
            int index = str.indexOf(emoji) + emoji.length();
            String beforeStr = str.substring(0, str.indexOf(emoji));
            if (index == str.length()) {
                return beforeStr;
            } else {
                str = removeWeChatEmoji(beforeStr + str.substring(index));
            }
        }
        return str;
    }

    /**
     * 获取文本中的微信表情 如[微笑]
     *
     * @param text:
     * @return: java.lang.String
     * @author jo.li
     * @description recursionSplitStr <br/>
     * @date 2020/12/24 15:54
     **/
    static String recursionSplitStr(String text) {
        if (text.contains("[") && text.contains("]")) {
            if (text.substring(0, text.indexOf("]") + 1).length() == 1) {
                text = recursionSplitStr(text.substring(1));
            } else {
                text = text.substring(0, text.indexOf("]") + 1);
            }
            if (text.indexOf("[") != text.lastIndexOf("[")) {
                text = text.substring(text.indexOf("[") + 1);
            } else {
                text = text.substring(text.indexOf("["), text.indexOf("]") + 1);
            }
            if (text.lastIndexOf("[") != 0) {
                text = recursionSplitStr(text);
            }
            return text;
        }
        return "";
    }

注意事项

  1. 实现代码复用需仔细测试,可能存在bug。
  2. 由于微信表情部分的判断没有使用穷举法,所以文本中若存在"[xxx]"格式字符串,会被认为是微信表情,存在误剔除的可能,还请使用时注意
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暴躁码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值