Emoji 在咱們生活中真的是愈來愈常見了,幾乎每次發消息的時候不帶個 Emoji,總以爲少了點什麼,彷佛乾巴巴的文字已經沒法承載咱們豐富的感情了。對於咱們開發者來講,如何將 Emoji 存入 MySql 數據庫或者取出來,就變成了一種必須掌握的技能了。html
Emoji 是一種圖形符號,可以很直觀地反應出某種文字含義。它讓我想起遠古時代的象形文字。java
Emoji 實際上是一個日語詞(えもじ),E
表示"絵",moji
表示"文字";連在一塊兒就是"絵文字",能夠更形象化地表情達意。mysql
若是咱們直接將 Emoji 表情存入數據庫的話,一般會出現下面這個錯誤。git
由於數據庫的字符編碼通常是 utf8(支持的編碼範圍爲 \u0000-\uFFFF
),而 Emoji 所在的編碼範圍是 \u1F601-\u1F64F
,超出 MySql 的邊界了。github
怎麼解決這個問題呢?sql
能夠將 MySql 的字符集由 utf8 調整爲 utf8mb4。utf8mb4 是 MySql 在 5.5.3 版本以後增長的一個編碼方式,用來兼容四字節的 Unicode(包括 Emoji)。數據庫
理論上,utf8mb4 是 utf8 的超集,其中 mb4 是 most bytes 4
的意思,將字符集修改成「utf8mb4」,並不會對已有的 utf8 編碼讀取產生任何問題。bash
但一般這種方式並非最優解,由於應用層還須要將 MySql 的鏈接方式做出如下調整:微信
jdbcUrl = jdbc:mysql://localhost/jfinal_demo?characterEncoding=utf8mb4&useSSL=false&zeroDateTimeBehavior=convertToNull
複製代碼
由原來的 characterEncoding=utf8
調整爲 characterEncoding=utf8mb4
。編碼
更友好的解決方式應該將 Emoji 當作字符串存儲,而後在取出來的時候再轉成 Emoji,這樣能夠兼容全部的數據庫版本。
我在 GitHub 上找到了這樣的一個庫——EmojiConverter,它能夠很方便地將 Emoji 轉換爲字符串的別名,同時也支持將這個別名轉換爲 Emoji。
1)在 pom.xml 文件中加入 EmojiConverter
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>java-emoji-converter</artifactId>
<version>0.1.1</version>
</dependency>
複製代碼
2)存儲 Emoji 以前調用 toHtml()
方法轉換一下
EmojiConverter emojiConverter = EmojiConverter.getInstance();
String html = emojiConverter.toHtml(keywords.getContent().trim());
// JFinal 的保存方式
Record record = new Record().set("content", html)
Db.save("keywords", record);
複製代碼
好比說,要存儲的內容當中包含了一個點讚的 Emoji。
那麼經過 emojiConverter.toHtml()
轉了以後的內容是什麼樣子呢?是一個碼點:👍
,debug 的時候截圖以下所示。
這樣的話,MySql 保存的內容就是一個普通的字符串了,編碼方式仍然能夠是 utf8。
3)顯示 Emoji 的時候調用 toUnicode()
方法格式化一下
String unicode = emojiConverter.toUnicode(content);
outMsg.setContent(unicode);
複製代碼
格式化後的內容能夠正常顯示在微信公衆號回覆的文本消息中,截圖以下所示。
謝謝你們的閱讀,原創不易,喜歡就點個贊,這將是我最強的寫做動力。若是你以爲文章對你有所幫助,也蠻有趣的,就關注一下個人公衆號,謝謝。