java處理emoji表情


前言

emoji表情也是使用Unicode編碼的,但UTF8編碼是不支持的。我們如果想存儲emoji到數據庫,一般有兩種方法,以mysql為例,將數據庫編碼從 utf8 改為 utf8mb4,第二種就是做一個轉換,將emoji表情轉換成另一個字符,今天我們就測試一下第二種方法。

實現

我們需要使用第三方開源庫emoji-java,github地址

<dependency>
   <groupId>com.vdurmont</groupId>
   <artifactId>emoji-java</artifactId>
   <version>4.0.0</version>
</dependency>

上邊為maven地址,測試的3個emoji表情為

將表情轉換為別名

import com.vdurmont.emoji.EmojiParser;

public class Client {

  public static void main(String[] args) {
    System.out.println(EmojiParser.parseToAliases("\uD83D\uDE04"));
    System.out.println(EmojiParser.parseToAliases("\uD83D\uDE38"));
    System.out.println(EmojiParser.parseToAliases("\uD83D\uDE1F"));
  }

}

輸出結果為

:smile:
:smile_cat:
:worried:

這樣數據庫就可以存儲了

將別名轉換為表情

import com.vdurmont.emoji.EmojiParser;

public class Client2 {

  public static void main(String[] args) {
    System.out.println(EmojiParser.parseToUnicode(":smile:"));
    System.out.println(EmojiParser.parseToUnicode(":smile_cat:"));
    System.out.println(EmojiParser.parseToUnicode(":worried:"));
  }

}

輸出3個emoji表情,因為markdown文件中不能出現emoji表情,所以這里就不顯示了。

將表情轉換為HTML格式

import com.vdurmont.emoji.EmojiParser;

public class Client3 {

  public static void main(String[] args) {
    System.out.println(EmojiParser.parseToHtmlHexadecimal("\uD83D\uDE04"));
    System.out.println(EmojiParser.parseToHtmlHexadecimal("\uD83D\uDE38"));
    System.out.println(EmojiParser.parseToHtmlHexadecimal("\uD83D\uDE1F"));
  }

}

輸出為

&#x1f604;
&#x1f638;
&#x1f61f;

HTML中顯示如下

原理分析

內部維護了一個emoji表情和別名的映射表,使用前綴樹保存所有emoji的Unicode編碼。

public class EmojiTrie {
  private Node root = new Node();

  public EmojiTrie(Collection<Emoji> emojis) {
    for (Emoji emoji : emojis) {
      Node tree = root;
      for (char c: emoji.getUnicode().toCharArray()) {
        if (!tree.hasChild(c)) {
          tree.addChild(c);
        }
        tree = tree.getChild(c);
      }
      tree.setEmoji(emoji);
    }
  }
  
}

參考

使用輕量級工具emoji-java處理emoji表情字符
特殊字符(包括emoji)梳理和UTF8編碼解碼原理
emoji表情存儲到數據庫的方法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM