一、問題產生的原因
mysql數據庫用的編碼是utf8_general_ci,就是utf-8編碼,結果也就報錯誤了。
為什么會出現這種原因?
因為mysql的utf8編碼的一個字符最多3個字節,但是一個emoji表情為4個字節,所以utf8不支持存儲emoji表情。但是utf8的超集utf8mb4一個字符最多能有4字節,所以能支持emoji表情的存儲。
二、解決方法
解決方法之一
把你的數據庫編碼集設置為utf8mb4,無論是數據庫還是表,還是字段。雖然會增加存儲,但是這個可以忽略不計。
解決方法之二
有句話說得好,問題來了要么解決要么折中解決。如果有些原因你不能修改數據庫編碼之類的,你可以用java的一些插件,如emoji-java這種emoji表情插件對表情進行特殊處理,然后保存或者去掉表情,這也是一種解決方法
引入包:
<dependency> <groupId>com.vdurmont</groupId> <artifactId>emoji-java</artifactId> <version>5.1.1</version> </dependency>
測試
public class Test {
public static void main(String[] args) {
String str = "Here is a boy: 👦🏿!";
System.out.println("原始字符為:\n" + str);
System.out.println("to aliases 之后:");
System.out.println(EmojiParser.parseToAliases(str));
System.out.println(EmojiParser.parseToAliases(str, EmojiParser.FitzpatrickAction.PARSE));
System.out.println(EmojiParser.parseToAliases(str, EmojiParser.FitzpatrickAction.REMOVE));
System.out.println(EmojiParser.parseToAliases(str, EmojiParser.FitzpatrickAction.IGNORE));
}
}
還原:
System.out.println(EmojiParser.parseToHtmlHexadecimal(str));
System.out.println("to html:");
String s = EmojiParser.parseToHtmlDecimal(str, EmojiParser.FitzpatrickAction.PARSE);
System.out.println(s);
System.out.println("還原:");
System.out.println(EmojiParser.parseToUnicode(s));
附:
某些表情符號支持使用Fitzpatrick修飾符,該修飾符可在5種色調之間進行選擇:
| 修飾符 | 類型 |
|---|---|
| 🏻 | 類型_1_2 |
| 🏼 | type_3 |
| 🏽 | type_4 |
| 🏾 | type_5 |
| 🏿 | type_6 |
EmojiManager
該EmojiManager提供一些靜態方法通過表情符號,數據庫搜索:
getForTag返回給定標簽的所有表情符號getForAlias返回別名的表情符號getAll返回所有表情符號isEmoji檢查字符串是否是表情符號containsEmoji檢查字符串是否包含表情符號
您還可以查詢元數據:
getAllTags返回可用標簽
或得到一切:
getAll返回所有表情符號
表情符號模型
Emoji 是一個POJO(普通的Java對象),它提供以下方法:
getUnicode返回表情符號的unicode表示形式getUnicode(Fitzpatrick)使用提供的Fitzpatrick修飾符返回表情符號的unicode表示形式。如果表情符號不支持Fitzpatrick修飾符,則此方法將拋出UnsupportedOperationException。如果提供的Fitzpatrick為null,則此方法將返回表情符號的unicode。getDescription返回表情符號的(可選)描述getAliases返回此表情符號的別名列表getTags返回此表情符號的標簽列表getHtmlDecimal返回表情符號的html十進制表示形式getHtmlHexadecimal返回表情符號的html十進制表示形式supportsFitzpatrick如果表情符號支持Fitzpatrick修飾符,則返回true;否則返回false
