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

01、前言

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

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

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

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

02、糟糕

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

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

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

怎麼解決這個問題呢?

03、utf8mb4

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

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

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

<code>

jdbcUrl

= jdbc:mysql://localhost/jfinal_demo?characterEncoding=utf8mb4&useSSL=

false

&zeroDateTimeBehavior=convertTo
/<code>

由原來的 <code>characterEncoding=utf8/<code>調整為<code>characterEncoding=utf8mb4/<code>。

04、EmojiConverter

更友好的解決方式應該將 Emoji 當做字符串存儲,然後在取出來的時候再轉成 Emoji,這樣可以兼容所有的數據庫版本。

我在 GitHub 上找到了這樣的一個庫——EmojiConverter,它可以很方便地將 Emoji 轉換為字符串的別名,同時也支持將這個別名轉換為 Emoji。

1)在 pom.xml 文件中加入 EmojiConverter

<code>

<

dependency

>


<

groupId

>

com.github.binarywang

groupId

>


<

artifactId

>

java-emoji-converter

artifactId

>


<

version

>

0.1.1

version

>


dependency

>


/<code>

2)存儲 Emoji 之前調用 <code>toHtml/<code>方法轉換一下

<code>EmojiConverter emojiConverter = EmojiConverter.getInstance;

String html = emojiConverter.toHtml(keywords.getContent.trim);

// JFinal 的保存方式
Record record = new Record.set(

"content"

, html)
Db.save(

"keywords"

,

record

);
/<code>

比如說,要存儲的內容當中包含了一個點讚的 Emoji。

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

那麼通過 <code>emojiConverter.toHtml/<code>轉了之後的內容是什麼樣子呢?是一個碼點:<code>👍/<code>,debug 的時候截圖如下所示。

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

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

3)顯示 Emoji 的時候調用 <code>toUnicode/<code>方法格式化一下

<code>

String

unicode = emojiConverter.toUnicode(content);
outMsg.setContent(unicode);
/<code>

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

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

05、最後

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

熱門推薦

1.【程序人生】程序員一般通過什麼途徑接私活?

2.【編程技術】羞,Java 字符串拼接竟然有這麼多姿勢

3.【推薦分享】技術進階交流群

沉默王二一個真特麼有趣的程序員


分享到:


相關文章: