1. 程式人生 > >java處理emoji表情存到mysql

java處理emoji表情存到mysql

最近在做聊天記錄存讀取時候,發現安卓手機發的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、用法(摘自於單元測試程式碼)
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);
}
PS:上面的單元測試程式碼emoji表情顯示亂碼,變成問號了,可以去前面發的github連結瞭解更多詳情!