一、問題產生的原因
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