日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Emoji表情符号兼容方案(适用ios,android,wp等平台)

發布時間:2024/4/15 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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編碼)??蛻舳苏埱髢热莸臅r候,需要根據不同的客戶端給出不同的編碼,ios4采用softbank編碼做替換,ios5采用unicode編碼直接支持。
    ? ? android或wp其他手機方案:
    ? ? 如果沒有emoji表情庫,將無法輸入。針對輸入問題,將統一采用unicode編碼存儲??蛻舳苏埱髢热莸臅r候,將統一用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;??
  • ????}??
  • ??????
  • ????//在ios上將ios5轉換為ios4編碼??
  • ????public?static?String?transToIOS4emoji(String?src)?{??
  • ????????return?StringUtils.replaceEach(src,?ios5emoji,?ios4emoji);??
  • ????}??
  • ????//在ios上將ios4轉換為ios5編碼??
  • ????public?static?String?transToIOS5emoji(String?src)?{??
  • ????????return?StringUtils.replaceEach(src,?ios4emoji,?ios5emoji);??
  • ????}??
  • ????//在android上將ios5的表情符替換為空??
  • ????public?static?String?transToAndroidemojiNull(String?src)?{??
  • ????????return?StringUtils.replaceEach(src,?ios5emoji,?androidnullemoji);??
  • ????}??
  • ??????
  • ????//在android上將ios5的表情符替換為SBUNICODE??
  • ????public?static?String?transToAndroidemojiSB(String?src)?{??
  • ????????return?StringUtils.replaceEach(src,?ios5emoji,?adsbuniemoji);??
  • ????}??
  • ??????
  • ????//在android上將SBUNICODE的表情符替換為ios5??
  • ????public?static?String?transSBToIOS5emoji(String?src)?{??
  • ????????return?StringUtils.replaceEach(src,?adsbuniemoji,?ios5emoji);??
  • ????}??
  • ??????
  • ????//eg.?param:?0xF0?0x9F?0x8F?0x80??
  • ????public?static?String?hexstr2String(String?hexstr)?throws?UnsupportedEncodingException{??
  • ????????byte[]?b?=?hexstr2bytes(hexstr);??
  • ????????return?new?String(b,?"UTF-8");??
  • ????}??
  • ??????
  • ????//eg.?param:?E018??
  • ????public?static?String?sbunicode2utfString(String?sbhexstr)?throws?UnsupportedEncodingException{??
  • ????????byte[]?b?=?sbunicode2utfbytes(sbhexstr);??
  • ????????return?new?String(b,?"UTF-8");??
  • ????}??
  • ??????
  • ????//eg.?param:?0xF0?0x9F?0x8F?0x80??
  • ????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;??
  • ????}??
  • ??????
  • ????//eg.?param:?E018??
  • ????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?{??
  • ????????//?TODO?Auto-generated?method?stub??
  • ????????byte[]?b1?=?{-30,-102,-67};?//ios5?//0xE2?0x9A?0xBD???????
  • ????????byte[]?b2?=?{-18,-128,-104};?//ios4?//"E018"??
  • ??????????
  • ????????//-------------------------------------??
  • ??????????
  • ????????byte[]?b3?=?{-16,-97,-113,-128};????//0xF0?0x9F?0x8F?0x80?????????
  • ????????byte[]?b4?=?{-18,-112,-86};?????????//E42A????
  • ??????????
  • ??????????
  • ????????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);??
  • ??????????
  • ??????????
  • ????????//轉成ios4的表情??
  • ????????String?ios4str?=?transToIOS5emoji(tmpstr);??
  • ????????byte[]?tmp?=?ios4str.getBytes();??
  • ????????//System.out.print(new?String(tmp,"utf-8"));??????????
  • ????????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等平台)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。