1. 程式人生 > 其它 >過濾文字或字串中的emoji表情(包括微信自帶表情處理)

過濾文字或字串中的emoji表情(包括微信自帶表情處理)

技術標籤:其他java

過濾字串中的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]"格式字串,會被認為是微信表情,存在誤剔除的可能,還請使用時注意