前言
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"));
}
}
輸出為
😄
😸
😟
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表情存儲到數據庫的方法