如果有人問你 MySql 怎么存取 Emoji,把這篇文章扔給他

01、前言

Emoji 在我們生活中真的是越來越常見了,幾乎每次發(fā)消息的時候不帶個 Emoji,總覺得少了點什么,似乎干巴巴的文字已經無法承載我們豐富的感情了。對于我們開發(fā)者來說,如何將 Emoji 存入 MySql 數據庫或者取出來,就變成了一種必須掌握的技能了。

Emoji 是一種圖形符號,能夠很直觀地反應出某種文字含義。它讓我想起遠古時代的象形文字。

Emoji 其實是一個日語詞(えもじ),E 表示"絵",moji 表示"文字";連在一起就是"絵文字",可以更形象化地表情達意。

02、糟糕

如果我們直接將 Emoji 表情存入數據庫的話,通常會出現下面這個錯誤。

因為數據庫的字符編碼一般是 utf8(支持的編碼范圍為 \u0000-\uFFFF),而 Emoji 所在的編碼范圍是 \u1F601-\u1F64F,超出 MySql 的邊界了。

怎么解決這個問題呢?

03、utf8mb4

可以將 MySql 的字符集由 utf8 調整為 utf8mb4。utf8mb4 是 MySql 在 5.5.3 版本之后增加的一個編碼方式,用來兼容四字節(jié)的 Unicode(包括 Emoji)。

理論上,utf8mb4 是 utf8 的超集,其中 mb4 是 most bytes 4 的意思,將字符集修改為“utf8mb4”,并不會對已有的 utf8 編碼讀取產生任何問題。

但通常這種方式并不是最優(yōu)解,因為應用層還需要將 MySql 的連接方式作出以下調整:

jdbcUrl = jdbc:mysql://localhost/jfinal_demo?characterEncoding=utf8mb4&useSSL=false&zeroDateTimeBehavior=convertToNull

由原來的 characterEncoding=utf8 調整為 characterEncoding=utf8mb4。

04、EmojiConverter

更友好的解決方式應該將 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() 轉了之后的內容是什么樣子呢?是一個碼點:&#128077,debug 的時候截圖如下所示。

這樣的話,MySql 保存的內容就是一個普通的字符串了,編碼方式仍然可以是 utf8。

3)顯示 Emoji 的時候調用 toUnicode() 方法格式化一下

String unicode = emojiConverter.toUnicode(content);
outMsg.setContent(unicode);

格式化后的內容可以正常顯示在微信公眾號回復的文本消息中,截圖如下所示。

05、最后

謝謝大家的閱讀,原創(chuàng)不易,喜歡就點個贊,這將是我最強的寫作動力。如果你覺得文章對你有所幫助,也蠻有趣的,就關注一下我的公眾號,謝謝。

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 先補習一下Unicode 與 UTF-8的歷史演變過程 http://www.itdecent.cn/p/ab0d...
    愛蛇閱讀 3,012評論 0 1
  • https://my.oschina.net/wingyiu/blog/153357 MYSQL 5.5 之前, ...
    愛蛇閱讀 2,879評論 0 0
  • MySQL數據庫對象與應用 2.1-MySQL數據類型 庫建立好之后基本不動,和我們接觸最頻繁的是表. 建表就是聲...
    極客圈閱讀 2,258評論 0 8
  • 什么是emoji emoji在誕生之初有多種標準,所以早期兼容性是個問題。但是現在已經標準化了,是unicode的...
    frankgo閱讀 1,672評論 0 0
  • 今天因為婆婆再三要求,我跟先生帶婆婆驅車40分鐘后到達酒店參加安利創(chuàng)客會,這次的安利有提供一些安利鍋做的小食,還有...
    Zoe_e443閱讀 154評論 0 1

友情鏈接更多精彩內容