過濾文字或字串中的emoji表情(包括微信自帶表情處理)
阿新 • • 發佈:2020-12-25
過濾字串中的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]"格式字串,會被認為是微信表情,存在誤剔除的可能,還請使用時注意!