Emoji 本質(zhì)與 Mysql 處理方式

<h3>先補(bǔ)習(xí)一下Unicode 與 UTF-8的歷史演變過(guò)程</h3>
http://www.reibang.com/p/ab0dcfb9bb74

以下內(nèi)容轉(zhuǎn)自文章:
http://blog.csdn.net/ugg/article/details/44225723

http://blog.csdn.net/tge7618291/article/details/7599902

emoji資料

今天研究了emoji妄辩,挺有意思帜讲,資料挺多,摘要一些信息給大家分享谷婆,也算是自己記錄學(xué)習(xí)。

emoji介紹

Emoji (絵文字肺缕,詞義來(lái)自日語(yǔ)えもじ鸦列,e-moji,moji在日語(yǔ)中的含義是字符)是一套起源于日本的12x12像素表情符號(hào)搪花,由栗田穣崇(Shigetaka Kurit)創(chuàng)作遏片,最早在日本網(wǎng)絡(luò)及手機(jī)用戶(hù)中流行,自蘋(píng)果公司發(fā)布的iOS 5輸入法中加入了emoji后撮竿,這種表情符號(hào)開(kāi)始席卷全球吮便,目前emoji已被大多數(shù)現(xiàn)代計(jì)算機(jī)系統(tǒng)所兼容的Unicode編碼采納,普遍應(yīng)用于各種手機(jī)短信和社交網(wǎng)絡(luò)中幢踏。近期髓需,更是有不少網(wǎng)友用emoji圖案玩猜字游戲,享受這種表情文化帶來(lái)的樂(lè)趣房蝉。

關(guān)于emoji的發(fā)音:很多人第一眼見(jiàn)到emoji便會(huì)下意識(shí)將其誤讀作“一磨嘰”僚匆,其實(shí)不然,emoji音譯過(guò)來(lái)大概讀作“誒磨嘰”搭幻,當(dāng)中“e”的發(fā)音頗似字母abc的a的發(fā)音咧擂。

最初日本的三大電信運(yùn)營(yíng)商各自有不同的字符定義,分別是DoCoMo檀蹋、KDDI和Softbank松申。隨著iOS內(nèi)置了Softbank的版本,emoji在全球范圍內(nèi)風(fēng)靡(iOS5版本以前)俯逾。而Google又自己定義了一套emoji字符贸桶。iOS5以后,apple采用了unicode定義的emoji字符(iOS5版本以后)桌肴。

unicode定義的emoji是四個(gè)字符皇筛,softbank為3個(gè)字符,emoji的四個(gè)字符從存儲(chǔ)到展示對(duì)應(yīng)沒(méi)有做過(guò)考慮的系統(tǒng)來(lái)說(shuō)坠七,簡(jiǎn)直就是災(zāi)難水醋。

面臨問(wèn)題:

插入Emoji表情旗笔,保存到數(shù)據(jù)庫(kù)時(shí)報(bào)錯(cuò):

SQLException: Incorrect string value: '\xF0\x9F\x98\x84' for column 'review' at row 1

UTF-8編碼有可能是兩個(gè)、三個(gè)离例、四個(gè)字節(jié)换团。Emoji表情是4個(gè)字節(jié),而MySQL的utf8編碼最多3個(gè)字節(jié)宫蛆,所以數(shù)據(jù)插不進(jìn)去艘包。

解決方案:過(guò)濾解決

把emoji直接過(guò)濾掉,簡(jiǎn)單方便有效耀盗。雖然損失了幾個(gè)emoji字符想虎,但強(qiáng)過(guò)不至于導(dǎo)致整條記錄丟失。

[php] view plain copy 在CODE上查看代碼片派生到我的代碼片
public static String removeNonBmpUnicode(String str) {
if (str == null) {
return null;
}
str = str.replaceAll("[^\u0000-\uFFFF]", "");
return str;
}
這種方案能預(yù)防能解決問(wèn)題叛拷,并且還能是程序更加健壯舌厨,但是從用戶(hù)體驗(yàn)上來(lái)說(shuō)并不好,用戶(hù)發(fā)的emoji表情丟了忿薇,看下面的解決方案裙椭。
解決方案:將Mysql的編碼從utf8轉(zhuǎn)換成utf8mb4。

從 MySQL 5.5.3 開(kāi)始署浩,MySQL 支持一種 utf8mb4 的字符集揉燃,這個(gè)字符集能夠支持 4 字節(jié)的 UTF8 編碼的字符。 utf8mb4 字符集能夠完美地向下兼容 utf8 字符串筋栋。在數(shù)據(jù)存儲(chǔ)方面炊汤,當(dāng)一個(gè)普通中文字符存入數(shù)據(jù)庫(kù)時(shí)仍然占用 3 個(gè)字節(jié),在存入一個(gè) Unified Emoji 表情的時(shí)候弊攘,它會(huì)自動(dòng)占用 4 個(gè)字節(jié)抢腐。所以在輸入輸出時(shí)都不會(huì)存在亂碼的問(wèn)題了。

要使用 MySQL 的這個(gè)特性襟交,首先需要把 MySQL 升級(jí)到 5.5.3 以上的版本迈倍。

其次,需要修改數(shù)據(jù)結(jié)構(gòu)中的字符集為 utf8mb4 捣域,如 utf8mb4_general_ci 授瘦。由于 utf8mb4 是 utf8 的超集,從 utf8 升級(jí)到 utf8mb4 不會(huì)有任何問(wèn)題竟宋,直接升級(jí)即可;如果從別的字符集如 gb2312 或者 gbk 轉(zhuǎn)化而來(lái)形纺,一定要先備份數(shù)據(jù)庫(kù)丘侠。

然后,修改 MySQL 的配置文件 /etc/my.cnf逐样,修改連接默認(rèn)字符集為 utf8mb4 蜗字,如果是自己寫(xiě)的 PHP 腳本打肝,也可以在連接數(shù)據(jù)庫(kù)以后首先執(zhí)行一句 SQL: SET NAMES utf8mb4;。這時(shí)候挪捕,PHP 應(yīng)該就可以正常保存 Emoji 到數(shù)據(jù)庫(kù)了粗梭。

這種方式可能帶來(lái)的問(wèn)題:

存儲(chǔ):在數(shù)據(jù)表中,對(duì)于變長(zhǎng)的字段(如VARCHAR2级零,TEXT)断医,utf8mb4最大可存儲(chǔ)的字符可能少于utf8系列的collation;在索引中奏纪,對(duì)于文本類(lèi)型的字段鉴嗤,utf8mb4可索引的字符少于utf8系列的collations。如InnoDB的索引最多使用767字節(jié)序调。如果使用utf8mb4醉锅,每一個(gè)字符都會(huì)預(yù)留4字節(jié)做索引,而utf8則預(yù)留3字節(jié)发绢。故此前者是191個(gè)字符硬耍,后者是255個(gè)字符。边酒。

性能:由于以上原因经柴,加上字符集大,utf8mb4的性能可能比utf8系列的collations低甚纲,可以參考stackoverfolow上的一個(gè)測(cè)試結(jié)果:http://stackoverflow.com/questions/766809/whats-the-difference-between-utf8-general-ci-and-utf8-unicode-ci口锭,差異不是特別大。

運(yùn)維:如果一個(gè)大的環(huán)境內(nèi)介杆,如果其他的數(shù)據(jù)庫(kù)都是utf8模式鹃操,把其中某個(gè)庫(kù)設(shè)置為utf8mb4模式,在后續(xù)交接運(yùn)維可能會(huì)造成問(wèn)題春哨,遺留下坑荆隘。

上下游:數(shù)據(jù)庫(kù)支持unicode的emoji存儲(chǔ),上下游不一定支持赴背。比如mysql客戶(hù)端驅(qū)動(dòng)(低版本的jdbc就不行)可能不支持utf8mb4椰拒,或者DDL的中間件不支持utf8mb4。web端處理utf8mb4字符展示凰荚,這些都有可能影響emoji的存儲(chǔ)活著展示燃观。

從上面的信息,從數(shù)據(jù)庫(kù)層面如果不是特別看重存儲(chǔ)便瑟,性能缆毁,運(yùn)維并能解決上下游的問(wèn)題,數(shù)據(jù)庫(kù)是完全可以支持emoji的到涂,但是有個(gè)新問(wèn)題沒(méi)有解決脊框,emoji在iOS上展示OK颁督,andriod設(shè)備如何展示emoji表情?

解決方案:轉(zhuǎn)義解決

1:unicode emoji轉(zhuǎn)softbank的emoji浇雹。

我們知道unicode emoji是4個(gè)字節(jié)沉御,softbank定義的emoji占用3個(gè)字節(jié)存儲(chǔ),通過(guò)emoji for php http://code.iamcal.com/php/emoji/昭灵,我們可以把unicode的emoji方式轉(zhuǎn)換為softbank方式吠裆,從而實(shí)現(xiàn)不修改數(shù)據(jù)庫(kù),就能存儲(chǔ)emoji虎锚,相對(duì)于數(shù)據(jù)庫(kù)層面的解決問(wèn)題的方式硫痰,動(dòng)作要小的多,并且也不會(huì)有性能窜护,運(yùn)維等方面的問(wèn)題效斑。但是有個(gè)不可避免的問(wèn)題是,Softbank方式已經(jīng)不再維護(hù)柱徙,所以新增加的emoji表情缓屠,Softbank中都沒(méi)有,會(huì)造成部分emoji表情丟失的情況护侮。

2:ubb

UBB代碼是HTML(標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言下的一個(gè)應(yīng)用)的一個(gè)變種敌完,是Ultimate Bulletin Board (國(guó)外的一個(gè)BBS程序)采用的一種特殊的TAG。您也許已經(jīng)對(duì)它很熟悉了羊初。UBB代碼很簡(jiǎn)單滨溉,功能很少,但是由于其Tag語(yǔ)法檢查實(shí)現(xiàn)非常容易长赞,所以不少網(wǎng)站引入了這種代碼晦攒,以方便網(wǎng)友使用顯示圖片/鏈接/加粗字體等常見(jiàn)功能。

比如emoji的太陽(yáng)符號(hào)得哆,他的unicode emoji編碼為U+2600脯颜,在存入數(shù)據(jù)庫(kù)時(shí),可以把它轉(zhuǎn)換成 UBB 代碼 [emoji]2600[/emoji] 保存贩据,讀取的時(shí)候栋操,可以轉(zhuǎn)換回來(lái)。當(dāng)然針對(duì)不同的設(shè)備饱亮,比如andriod我們可以轉(zhuǎn)義成andriod可以處理的emoji符號(hào)矾芙。

這種轉(zhuǎn)移,可以很好解決iOS和Andriod顯示emoji的問(wèn)題近上,但是還存在幾個(gè)問(wèn)題蠕啄。

1:andriod和iOS的emoji并不相同,相同的編碼 可能在iOS上是太陽(yáng),而在andriod上是陰天歼跟,解決這種問(wèn)題方式最好做下iOS和andriod下的emoji映射,同時(shí)可以在web上通過(guò)js轉(zhuǎn)義處理格遭。

2:性能哈街,采用轉(zhuǎn)義的方式處理,性能肯定會(huì)有所下降拒迅,但是可以容忍骚秦。

與UBB對(duì)應(yīng)的是html轉(zhuǎn)義,這種方式璧微,其實(shí)和ubb有些類(lèi)似作箍, 使用 HTML轉(zhuǎn)義字符 ?,結(jié)果和性能和UBB差不多前硫,從規(guī)范化上來(lái)說(shuō)胞得,ubb方式更好一些。

參考資料

PHP-emoji轉(zhuǎn)換表:http://code.iamcal.com/php/emoji/
unicode Emoji Symbols: http://www.unicode.org/~scherer/emoji4unicode/20091221/utc.html
emoji圖標(biāo)和unicode對(duì)應(yīng)關(guān)系:http://www.easyapns.com/iphone-emoji-alerts
談?wù)刄nicode編碼屹电,簡(jiǎn)要解釋UCS阶剑、UTF、BMP危号、BOM等名詞:http://www.fmddlmyy.cn/text6.html
emoji在線轉(zhuǎn)換工具:http://unicodey.com/js-emoji/demo.htm
Emoji表情圖標(biāo)在iOS與PHP之間通信及MySQL存儲(chǔ):http://blog.csdn.NET/wildfireli/article/details/9370161
Mysql中校對(duì)集utf8_unicode_ci與utf8_general_ci的區(qū)別:http://hi.baidu.com/phpkoo/item/38238bd8505899e955347fca牧愁,http://stackoverflow.com/questions/766809/whats-the-difference-between-utf8-general-ci-and-utf8-unicode-ci
Mysql排序規(guī)則utf8_unicode_ci與utf8_general_ci的區(qū)別:http://justdo2008.iteye.com/blog/2162842
Unicode Character Sets:http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-sets.html
MySQL設(shè)置utf8mb4編碼:http://www.linuxidc.com/Linux/2014-07/104231.htm|
andriod支持emoji解決方案:http://blog.csdn.net/waylife/article/details/11095113
Supporting New Emojis on iOS 6:http://blog.manbolo.com/2012/10/29/supporting-new-emojis-on-ios-6
讓MySql支持Emoji表情(MySQL中4字節(jié)utf8字符保存方法):http://www.w2bc.com/Article/8533
如何處理emoji等4字節(jié)的Unicode字符:http://zhidao.baidu.com/link?url=z6PW1ya6plRBgFN7M2zdVLXUnmxYcH2_VYK8nW9Yi9-kh2estgmJomw1LssmsA853WYHsRtulkJn2okq0a3TAUDQHIiMe7b0VS-FeGMNYUu
suppoting new emoji for ios6:http://blog.manbolo.com/2012/10/29/supporting-new-emojis-on-ios-6
UTF-8格式emoji:http://punchdrunker.github.io/iOSEmoji/table_html/ios6/index.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市外莲,隨后出現(xiàn)的幾起案子猪半,更是在濱河造成了極大的恐慌,老刑警劉巖偷线,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件磨确,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡淋昭,警方通過(guò)查閱死者的電腦和手機(jī)俐填,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)翔忽,“玉大人英融,你說(shuō)我怎么就攤上這事⌒剑” “怎么了驶悟?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)材失。 經(jīng)常有香客問(wèn)我痕鳍,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任笼呆,我火速辦了婚禮熊响,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好彩掐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著洪碳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪叼屠。 梳的紋絲不亂的頭發(fā)上瞳腌,一...
    開(kāi)封第一講書(shū)人閱讀 51,775評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音镜雨,去河邊找鬼嫂侍。 笑死,一個(gè)胖子當(dāng)著我的面吹牛冷离,可吹牛的內(nèi)容都是我干的吵冒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼西剥,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼痹栖!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起瞭空,我...
    開(kāi)封第一講書(shū)人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤揪阿,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后咆畏,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體南捂,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年旧找,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了溺健。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡钮蛛,死狀恐怖鞭缭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情魏颓,我是刑警寧澤岭辣,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站甸饱,受9級(jí)特大地震影響沦童,放射性物質(zhì)發(fā)生泄漏仑濒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一偷遗、第九天 我趴在偏房一處隱蔽的房頂上張望墩瞳。 院中可真熱鬧,春花似錦鹦肿、人聲如沸矗烛。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至碌嘀,卻和暖如春涣旨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背股冗。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工霹陡, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人止状。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓烹棉,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親怯疤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子浆洗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

推薦閱讀更多精彩內(nèi)容