生活随笔
收集整理的這篇文章主要介紹了
Emoji表情符号兼容方案(适用ios,android,wp等平台)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
http://blog.csdn.net/qdkfriend/article/details/7576524
?
Emoji表情符號兼容方案
一 什么是Emoji? ?
? ? ??emoji就是表情符號;詞義來自日語(えもじ,e-moji,moji在日語中的含義是字符)
表情符號現已普遍應用于手機短信和網絡聊天軟件。
emoji表情符號,在外國的手機短信里面已經是很流行使用的一種表情。
手機上如何使用emoji:
1.iphone、ipad系統:安裝emoji free,再設置-通用-鍵盤-國際鍵盤-添加新的鍵盤,然后把emoji添加在里面即可在發短信和一些輸入文本的文本框中輸入表情。
IOS 5用戶可直接從通用中添加emoji 鍵盤,無需再安裝emoji free
2.android系統:安裝“GO輸入法國際版”后,在輸入法里面點選安裝emoji插件可以使用。另外“百度輸入法”也自帶emoji表情
3.Windows Phone : 安裝此 Emoji Keys,在其中輸入之后復制粘貼到需要輸入表情的地方即可
? ? <此段摘自百度百科?http://baike.baidu.com/view/2631589.htm>
二 Emoji表情符號問題
? ?1 問題:
? ? ?IOS版本之間發送的Emoji表情符號不兼容,只看到方塊
? ? ?不同IOS版本在數據庫存數據時,有時會發生系統錯誤
? ?2 現象:
? ? ?IOS 4 輸入Emoji表情符,在IOS5.01 顯示正常,在IOS5.1中(大陸版)顯現為方塊, 但IOS5.01/5.1輸入的表情符號,顯示正 ? ? ?常
? ? ?IOS5.01/5.1 輸入表情符,在IOS5.01/5.1中顯示正常,但在IOS4.X顯示為方塊
? ? ?輸入Emoji入帖子正文, 可正常存儲。 但用戶昵稱在IOS4.X 輸入Emoji,系統正常, 而IOS5.01/5.1則提示系統錯誤。
? ?3 本質:
? ? ?iOS 5 and OS X 10.7 (Lion) use the Unicode 6.0 standard ‘unified’ code points for emoji.
? ? ?iOS 5 Emoji ?采用Unicode 6 標準來統一code points?
? ? ?iOS 4 on SoftBank iPhones used a set of unofficial code points in the Unicode Private Use Area, and so aren't ? ? ?compatible with any other systems
? ? ?iOS 4 采用SoftBank Unicode, 一種非官方的, 采用私有Unicode 區域。
? ?4 舉例:
? ? ?one emoji symbol "tiger", it is "\U0001f42f" in iOS5, but "\ue050" in earlier iOS version
? ? 虎臉Emoji符號在iOS5 為Unicode:\U0001f42f;而在IOS4.x 為:\ue050 (SoftBank 編碼)
? ? 另外: 按理講, 從iOS5 應該兼容以前版本的emoji, 但現在出現5.01版本完美兼容(無論大陸版,美版,還是港版), 而5.1 ? ? 大陸版出現了不兼容現象(騰訊微信也出現了同樣的問題)。
三 問題分析
? ?1 系統存儲錯誤問題(如昵稱,帖子內容)
? ? 原因:
? ? 由于IOS5.X 采用新的Unicode, 其UTF8 編碼大多為4個字節, 而由于昵稱/帖子內容column并沒設成utf8mb4,因此存儲會 ? ?發生錯誤。
? ? 解決方法:
? ? 將昵稱/帖子內容設成utf8mb4
? ?2 不同iOS 之間Emoji 不兼容的問題。?
? ?原因:
? ?iOS 5 到4 不兼容的問題,很簡單,unicode6 和softbank編碼的不同
? ?iOS 4 到 5,按理說應該兼容,也就是說,iOS應該自動判斷如果是softbank編碼,自動轉成unicode6。但現在看來, iOS5.1(大陸版)好像只支持unicode6, 而不支持softbank.?
? ?解決方法:?
? ?客戶端發送emoji-encoding: Softbank或unicode6, 由服務端分別給出相應的編碼表。
四 解決方案
? ?1 數據存儲(MySQL varchar ?數據類型對UTF8 支持問題)
? ? MYSQL 5.5 之前, UTF8 編碼只支持1-3個字節, 從MYSQL5.5開始,可支持4個字節UTF編碼,但要特殊標記。例如我們的帖子內容項,我們加上了這個支持。服務端mysql統一存儲為ios5.x也就是Unicode編碼。
? ?對應alter語句:
[sql]?view plaincopy
ALTER?TABLE?topic?MODIFY?COLUMN?content?varchar(500)?CHARACTER?SET?utf8mb4?COLLATE?utf8mb4_unicode_ci?DEFAULT?NULL?COMMENT?'內容';?? ? ? 2 編碼轉換:
? ? iphone手機方案
? ? 客戶端輸入內容時候,統一存儲為unicode編碼(這里需要從softbank編碼轉換為unicode編碼)。客戶端請求內容的時候,需要根據不同的客戶端給出不同的編碼,ios4采用softbank編碼做替換,ios5采用unicode編碼直接支持。
? ? android或wp其他手機方案:
? ? 如果沒有emoji表情庫,將無法輸入。針對輸入問題,將統一采用unicode編碼存儲。客戶端請求內容的時候,將統一用softbank編碼,客戶端需要把emoji表情符號內置到客戶端,做對應的編碼和img替換。
? ? web解決方案:
? ? 參考android或wp其他手機方案
五 部分代碼
? ?1 sql代碼
[sql]?view plaincopy
CREATE?TABLE?`ios_emoji`?(????`id`?int(11)?NOT?NULL?AUTO_INCREMENT?COMMENT?'自增ID',????`unicode`?varchar(100)?CHARACTER?SET?utf8mb4?COLLATE?utf8mb4_unicode_ci?DEFAULT?NULL?COMMENT?'Unicode編碼',????`utf8`?varchar(100)?CHARACTER?SET?utf8mb4?COLLATE?utf8mb4_unicode_ci?DEFAULT?NULL?COMMENT?'UTF8編碼',????`utf16`?varchar(100)?CHARACTER?SET?utf8mb4?COLLATE?utf8mb4_unicode_ci?DEFAULT?NULL?COMMENT?'UTF16編碼',????`sbunicode`?varchar(100)?CHARACTER?SET?utf8mb4?COLLATE?utf8mb4_unicode_ci?DEFAULT?NULL?COMMENT?'SBUnicode編碼',????`filename`?varchar(100)?CHARACTER?SET?utf8mb4?COLLATE?utf8mb4_unicode_ci?DEFAULT?NULL?COMMENT?'文件名',????`filebyte`?longblob?COMMENT?'文件內容字節',????PRIMARY?KEY?(`id`)??)?ENGINE=InnoDB?DEFAULT?CHARSET=utf8?ROW_FORMAT=COMPACT?COMMENT='ios表情編碼表';??
? ?2 java代碼
[java]?view plaincopy
import?java.io.UnsupportedEncodingException;??import?org.apache.commons.lang.StringUtils;??????public?class?IOSEmojiUtil?{????????????public?static?String[]?ios5emoji?;??????public?static?String[]?ios4emoji?;??????public?static?String[]?androidnullemoji?;??????public?static?String[]?adsbuniemoji;????????????public?static?void?initios5emoji(String[]?i5emj,String[]?i4emj,String[]?adnullemoji,String[]?adsbemoji){??????????ios5emoji?=?i5emj;??????????ios4emoji?=?i4emj;??????????androidnullemoji?=?adnullemoji;??????????adsbuniemoji?=?adsbemoji;??????}????????????????public?static?String?transToIOS4emoji(String?src)?{??????????return?StringUtils.replaceEach(src,?ios5emoji,?ios4emoji);??????}??????????public?static?String?transToIOS5emoji(String?src)?{??????????return?StringUtils.replaceEach(src,?ios4emoji,?ios5emoji);??????}??????????public?static?String?transToAndroidemojiNull(String?src)?{??????????return?StringUtils.replaceEach(src,?ios5emoji,?androidnullemoji);??????}????????????????public?static?String?transToAndroidemojiSB(String?src)?{??????????return?StringUtils.replaceEach(src,?ios5emoji,?adsbuniemoji);??????}????????????????public?static?String?transSBToIOS5emoji(String?src)?{??????????return?StringUtils.replaceEach(src,?adsbuniemoji,?ios5emoji);??????}????????????????public?static?String?hexstr2String(String?hexstr)?throws?UnsupportedEncodingException{??????????byte[]?b?=?hexstr2bytes(hexstr);??????????return?new?String(b,?"UTF-8");??????}????????????????public?static?String?sbunicode2utfString(String?sbhexstr)?throws?UnsupportedEncodingException{??????????byte[]?b?=?sbunicode2utfbytes(sbhexstr);??????????return?new?String(b,?"UTF-8");??????}????????????????public?static?byte[]?hexstr2bytes(String?hexstr){??????????String[]?hexstrs?=?hexstr.split("?");??????????byte[]?b?=?new?byte[hexstrs.length];????????????????????for(int?i=0;i<hexstrs.length;i++){??????????????b[i]?=?hexStringToByte(hexstrs[i].substring(2))[0];??????????}??????????return?b;??????}????????????????public?static?byte[]?sbunicode2utfbytes(String?sbhexstr)?throws?UnsupportedEncodingException{??????????int?inthex?=?Integer.parseInt(sbhexstr,?16);??????????char[]?schar?=?{(char)inthex};??????????byte[]?b?=?(new?String(schar)).getBytes("UTF-8");??????????return?b;??????}????????????public?static?byte[]?hexStringToByte(String?hex)?{??????????int?len?=?(hex.length()?/?2);??????????byte[]?result?=?new?byte[len];??????????char[]?achar?=?hex.toCharArray();??????????for?(int?i?=?0;?i?<?len;?i++)?{??????????????int?pos?=?i?*?2;??????????????result[i]?=?(byte)?(toByte(achar[pos])?<<?4?|?toByte(achar[pos?+?1]));??????????}??????????return?result;??????}??????????private?static?byte?toByte(char?c)?{??????????byte?b?=?(byte)?"0123456789ABCDEF".indexOf(c);??????????return?b;??????}????????????public?static?void?main(String[]?args)?throws?UnsupportedEncodingException?{??????????????????byte[]?b1?=?{-30,-102,-67};?????????byte[]?b2?=?{-18,-128,-104};?????????????????????????????????????byte[]?b3?=?{-16,-97,-113,-128};????????????byte[]?b4?=?{-18,-112,-86};?????????????????????????????????????ios5emoji?=?new?String[]{new?String(b1,"utf-8"),new?String(b3,"utf-8")};??????????ios4emoji?=?new?String[]{new?String(b2,"utf-8"),new?String(b4,"utf-8")};??????????????????????????????????????????byte[]?testbytes?=?{105,111,115,-30,-102,-67,32,36,-18,-128,-104,32,36,-16,-97,-113,-128,32,36,-18,-112,-86};??????????String?tmpstr?=?new?String(testbytes,"utf-8");??????????System.out.println(tmpstr);??????????????????????????????????????String?ios4str?=?transToIOS5emoji(tmpstr);??????????byte[]?tmp?=?ios4str.getBytes();??????????????????for(byte?b:tmp){??????????????System.out.print(b);??????????????System.out.print("?");??????????}??????}????????}??
六 參考資料
1 Emoji 全編碼表:(我參考的這個)
? http://punchdrunker.github.com/iOSEmoji/table_html/flower.html
2 Emoji全編碼表
? http://code.iamcal.com/php/emoji/
3 iOS5/4 Emoji ?兼容性:
? http://stackoverflow.com/questions/7856775/how-to-convert-the-old-emoji-encoding-to-the-latest-encoding-in-ios5
4 MySQL emoji問題
? http://dropblood.com/archives/ios-mysql-emoji
5 Emoji 中文對應表
? http://www.iapps.im/wp-content/uploads/2012/02/emoji-pinyin.png?r=010
七 下載資源?
emoji圖片和編碼表?http://download.csdn.net/detail/qdkfriend/4309051
? 包括emoji文件表,emoji數據編碼表(Unicode編碼,UTF8編碼,UTF16編碼,SBUnicode編碼)
總結
以上是生活随笔為你收集整理的Emoji表情符号兼容方案(适用ios,android,wp等平台)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。