<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