java處理emoji表情存到mysql
阿新 • • 發佈:2019-01-25
最近在做聊天記錄存讀取時候,發現安卓手機發的emoji表情直接存入mysql會報錯。
類似:java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x8E\xF0\x9F...' for......
發生這個問題的原因就是:emoji表情是utf-8編碼,但是佔用4個位元組,而mysql的utf-8字符集的資料庫每個字元只有3個位元組,所以無法儲存emoji表情到mysql資料庫。
解決辦法:
一、修改資料庫字符集為utf8mb4
在5.5.3版本之後的mysql資料庫支援utf8mb4字符集,可以儲存4個位元組的emoji表情。需要修改資料庫、表、欄位的字符集為utf8mb4。
不太推薦,原因麻煩,畢竟資料庫這東西不是一般程式設計師可以有許可權的。
二、將字串中包含的emoji表情字元全部替換成其他字元
如果不用展示具體表情的話,可以用這種簡單粗暴方法。/** * emoji表情替換 * * @param source 原字串 * @param slipStr emoji表情替換成的字串 * @return 過濾後的字串 */ private String filterEmoji(String source,String slipStr) { if(StringUtils.isNotBlank(source)){ return source.replaceAll("[\\ud800\\udc00-\\udbff\\udfff\\ud800-\\udfff]", slipStr); }else{ return source; } }
三、通過第三方jar包來轉換emoji表情 (推薦)
1、將以下內容加入你的maven的pom檔案中
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>java-emoji-converter</artifactId>
<version>0.1.1</version>
</dependency>
2、用法(摘自於單元測試程式碼)
PS:上面的單元測試程式碼emoji表情顯示亂碼,變成問號了,可以去前面發的github連結瞭解更多詳情!private EmojiConverter emojiConverter = EmojiConverter.getInstance(); @Test public void testToAlias() { String str = " An ??awesome ??string with a few ??emojis!"; String alias = this.emojiConverter.toAlias(str); System.out.println(str); System.out.println("EmojiConverterTest.testToAlias()=====>"); System.out.println(alias); Assert.assertEquals( ":no_good: :ok_woman: :couple_with_heart:An :smiley::grinning:awesome :smiley::smiley:string with a few :smiley::wink:emojis!", alias); } @Test public void testToHtml() { String str = " An ??awesome ??string with a few ??emojis!"; String result = this.emojiConverter.toHtml(str); System.out.println(str); System.out.println("EmojiConverterTest.testToHtml()=====>"); System.out.println(result); Assert.assertEquals( "? ? ?An ??awesome ??string with a few ??emojis!", result); } @Test public void testToUnicode() { String str = " :smiley: :grinning: :wink:"; String result = this.emojiConverter.toUnicode(str); System.err.println(str); System.err.println("EmojiConverterTest.testToUnicode()=====>"); System.err.println(result); Assert.assertEquals("? ? ? ? ? ?", result); }