过滤字符串中的emoji表情
网上搜索了很久,都没有一个很好的解决方案,经过多方查证和测试,有了自己的处理方案,写出来分享一下。
问题重点
- 微信聊天记录中,微信自带表情会变成[微笑] [握手]等格式,如何判断出字符串中该类表情以及如何去除
- 对于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 "";
}
注意事项
- 实现代码复用需仔细测试,可能存在bug。
- 由于微信表情部分的判断没有使用穷举法,所以文本中若存在"[xxx]"格式字符串,会被认为是微信表情,存在误剔除的可能,还请使用时注意!