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

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: http://blog.csdn.net/qdkfriend/article/details/7576524   Emoji表情符号兼容方案 一 什么是Emoji          emoji就是表情符号;词义来自日语(えもじ,e-moji,moji在日语中的含义是字符)  表情符号现已普遍应用于手机短信和网络聊天软件。

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 plain copy
 
  1. 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 plain copy
 
  1. CREATE TABLE `ios_emoji` (  
  2.   `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增ID',  
  3.   `unicode` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'Unicode编码',  
  4.   `utf8` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'UTF8编码',  
  5.   `utf16` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'UTF16编码',  
  6.   `sbunicode` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'SBUnicode编码',  
  7.   `filename` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '文件名',  
  8.   `filebyte` longblob COMMENT '文件内容字节',  
  9.   PRIMARY KEY (`id`)  
  10. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='ios表情编码表';  


   2 java代码

[java]  view plain copy
 
  1. import java.io.UnsupportedEncodingException;  
  2. import org.apache.commons.lang.StringUtils;  
  3.   
  4.   
  5. public class IOSEmojiUtil {  
  6.       
  7.     public static String[] ios5emoji ;  
  8.     public static String[] ios4emoji ;  
  9.     public static String[] androidnullemoji ;  
  10.     public static String[] adsbuniemoji;  
  11.       
  12.     public static void initios5emoji(String[] i5emj,String[] i4emj,String[] adnullemoji,String[] adsbemoji){  
  13.         ios5emoji = i5emj;  
  14.         ios4emoji = i4emj;  
  15.         androidnullemoji = adnullemoji;  
  16.         adsbuniemoji = adsbemoji;  
  17.     }  
  18.       
  19.     //在ios上将ios5转换为ios4编码  
  20.     public static String transToIOS4emoji(String src) {  
  21.         return StringUtils.replaceEach(src, ios5emoji, ios4emoji);  
  22.     }  
  23.     //在ios上将ios4转换为ios5编码  
  24.     public static String transToIOS5emoji(String src) {  
  25.         return StringUtils.replaceEach(src, ios4emoji, ios5emoji);  
  26.     }  
  27.     //在android上将ios5的表情符替换为空  
  28.     public static String transToAndroidemojiNull(String src) {  
  29.         return StringUtils.replaceEach(src, ios5emoji, androidnullemoji);  
  30.     }  
  31.       
  32.     //在android上将ios5的表情符替换为SBUNICODE  
  33.     public static String transToAndroidemojiSB(String src) {  
  34.         return StringUtils.replaceEach(src, ios5emoji, adsbuniemoji);  
  35.     }  
  36.       
  37.     //在android上将SBUNICODE的表情符替换为ios5  
  38.     public static String transSBToIOS5emoji(String src) {  
  39.         return StringUtils.replaceEach(src, adsbuniemoji, ios5emoji);  
  40.     }  
  41.       
  42.     //eg. param: 0xF0 0x9F 0x8F 0x80  
  43.     public static String hexstr2String(String hexstr) throws UnsupportedEncodingException{  
  44.         byte[] b = hexstr2bytes(hexstr);  
  45.         return new String(b, "UTF-8");  
  46.     }  
  47.       
  48.     //eg. param: E018  
  49.     public static String sbunicode2utfString(String sbhexstr) throws UnsupportedEncodingException{  
  50.         byte[] b = sbunicode2utfbytes(sbhexstr);  
  51.         return new String(b, "UTF-8");  
  52.     }  
  53.       
  54.     //eg. param: 0xF0 0x9F 0x8F 0x80  
  55.     public static byte[] hexstr2bytes(String hexstr){  
  56.         String[] hexstrs = hexstr.split(" ");  
  57.         byte[] b = new byte[hexstrs.length];  
  58.           
  59.         for(int i=0;i<hexstrs.length;i++){  
  60.             b[i] = hexStringToByte(hexstrs[i].substring(2))[0];  
  61.         }  
  62.         return b;  
  63.     }  
  64.       
  65.     //eg. param: E018  
  66.     public static byte[] sbunicode2utfbytes(String sbhexstr) throws UnsupportedEncodingException{  
  67.         int inthex = Integer.parseInt(sbhexstr, 16);  
  68.         char[] schar = {(char)inthex};  
  69.         byte[] b = (new String(schar)).getBytes("UTF-8");  
  70.         return b;  
  71.     }  
  72.       
  73.     public static byte[] hexStringToByte(String hex) {  
  74.         int len = (hex.length() / 2);  
  75.         byte[] result = new byte[len];  
  76.         char[] achar = hex.toCharArray();  
  77.         for (int i = 0; i < len; i++) {  
  78.             int pos = i * 2;  
  79.             result[i] = (byte) (toByte(achar[pos]) << 4 | toByte(achar[pos + 1]));  
  80.         }  
  81.         return result;  
  82.     }  
  83.   
  84.   
  85.     private static byte toByte(char c) {  
  86.         byte b = (byte) "0123456789ABCDEF".indexOf(c);  
  87.         return b;  
  88.     }  
  89.       
  90.     public static void main(String[] args) throws UnsupportedEncodingException {  
  91.         // TODO Auto-generated method stub  
  92.         byte[] b1 = {-30,-102,-67}; //ios5 //0xE2 0x9A 0xBD       
  93.         byte[] b2 = {-18,-128,-104}; //ios4 //"E018"  
  94.           
  95.         //-------------------------------------  
  96.           
  97.         byte[] b3 = {-16,-97,-113,-128};    //0xF0 0x9F 0x8F 0x80         
  98.         byte[] b4 = {-18,-112,-86};         //E42A    
  99.           
  100.           
  101.         ios5emoji = new String[]{new String(b1,"utf-8"),new String(b3,"utf-8")};  
  102.         ios4emoji = new String[]{new String(b2,"utf-8"),new String(b4,"utf-8")};      
  103.           
  104.           
  105.         //测试字符串  
  106.         byte[] testbytes = {105,111,115,-30,-102,-67,32,36,-18,-128,-104,32,36,-16,-97,-113,-128,32,36,-18,-112,-86};  
  107.         String tmpstr = new String(testbytes,"utf-8");  
  108.         System.out.println(tmpstr);  
  109.           
  110.           
  111.         //转成ios4的表情  
  112.         String ios4str = transToIOS5emoji(tmpstr);  
  113.         byte[] tmp = ios4str.getBytes();  
  114.         //System.out.print(new String(tmp,"utf-8"));          
  115.         for(byte b:tmp){  
  116.             System.out.print(b);  
  117.             System.out.print(" ");  
  118.         }  
  119.     }  
  120.       
  121. }  



六 参考资料
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编码)

如何联系我:【万里虎】www.bravetiger.cn 【QQ】3396726884 (咨询问题100元起,帮助解决问题500元起) 【博客】http://www.cnblogs.com/kenshinobiy/
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
搜索推荐 Android开发 iOS开发
安卓与iOS系统的用户界面设计对比分析
本文通过对安卓和iOS两大操作系统的用户界面设计进行对比分析,探讨它们在设计理念、交互方式、视觉风格等方面的差异及各自特点,旨在帮助读者更好地理解和评估不同系统的用户体验。
21 1
|
4天前
|
存储 缓存 安全
基于iOS平台的高效图片缓存策略实现
【4月更文挑战第22天】 在移动应用开发中,图片资源的加载与缓存是影响用户体验的重要因素之一。尤其对于iOS平台,由于设备存储空间的限制以及用户对流畅性的高要求,设计一种合理的图片缓存策略显得尤为关键。本文将探讨在iOS环境下,如何通过使用先进的图片缓存技术,包括内存缓存、磁盘缓存以及网络请求的优化,来提高应用的性能和响应速度。我们将重点分析多级缓存机制的设计与实现,并对可能出现的问题及其解决方案进行讨论。
|
4天前
|
存储 缓存 算法
实现iOS平台的高效图片缓存策略
【4月更文挑战第22天】在移动应用开发中,图片资源的处理是影响用户体验的重要因素之一。特别是对于图像资源密集型的iOS应用,如何有效地缓存图片以减少内存占用和提升加载速度,是开发者们面临的关键挑战。本文将探讨一种针对iOS平台的图片缓存策略,该策略通过结合内存缓存与磁盘缓存的机制,并采用先进的图片解码和异步加载技术,旨在实现快速加载的同时,保持应用的内存效率。
|
22天前
|
存储 缓存 iOS开发
实现iOS平台的高效图片缓存策略
【4月更文挑战第4天】在移动应用开发中,图片资源的加载与缓存是影响用户体验的关键因素之一。尤其对于iOS平台,由于设备存储和内存资源的限制,设计一个高效的图片缓存机制尤为重要。本文将深入探讨在iOS环境下,如何通过技术手段实现图片的高效加载与缓存,包括内存缓存、磁盘缓存以及网络层面的优化,旨在为用户提供流畅且稳定的图片浏览体验。
|
29天前
|
搜索推荐 Android开发 iOS开发
安卓与iOS操作系统的发展与比较
在移动互联网时代,安卓和iOS两大操作系统在智能手机市场竞争激烈。本文将从技术架构、生态系统、用户体验等方面对安卓和iOS进行比较分析,探讨它们各自的特点和发展趋势。
|
1月前
|
运维 监控 安全
应用研发平台EMAS常见问题之sophix ios flutter热更新如何解决
应用研发平台EMAS(Enterprise Mobile Application Service)是阿里云提供的一个全栈移动应用开发平台,集成了应用开发、测试、部署、监控和运营服务;本合集旨在总结EMAS产品在应用开发和运维过程中的常见问题及解决方案,助力开发者和企业高效解决技术难题,加速移动应用的上线和稳定运行。
79 0
|
1月前
|
Web App开发 前端开发 网络安全
前端分析工具之 Charles 录制 Android/IOS 手机的 https 应用
【2月更文挑战第21天】前端分析工具之 Charles 录制 Android/IOS 手机的 https 应用
58 1
前端分析工具之 Charles 录制 Android/IOS 手机的 https 应用
|
1月前
|
人工智能 算法 Android开发
探索未来:Android与iOS在人工智能时代的融合与创新
【2月更文挑战第13天】 在数字化时代的快速发展下,Android与iOS作为两大主流移动操作系统,它们在人工智能(AI)领域的融合与创新已成为推动科技进步的关键力量。本文将从操作系统的核心功能拓展、AI技术的集成应用,以及开发者生态系统的演变三个维度,深入探讨Android和iOS如何在AI时代实现协同发展,以及这一进程对用户体验、应用开发和行业趋势产生的深远影响。通过对比分析和案例研究,我们旨在揭示两大平台在AI驱动下的创新路径,及其对未来科技格局的塑造作用。
|
1月前
|
人工智能 自然语言处理 语音技术
探索未来:安卓与iOS在人工智能领域的竞争与合作
【2月更文挑战第12天】本文深入探讨了安卓和iOS两大操作系统在人工智能(AI)领域的发展现状、竞争态势及未来合作可能性。通过对比分析两系统在AI技术集成、开发者支持、用户体验优化等方面的表现,揭示了它们各自的优势与挑战。文章最终展望了一个既有竞争又充满合作的未来,认为安卓和iOS的共同进步将推动整个人工智能技术向前发展,为用户带来更加智能、便捷的生活体验。
|
1月前
|
搜索推荐 Android开发 iOS开发
探索未来:安卓与iOS双系统的融合与创新
【2月更文挑战第12天】 在数字化时代,智能手机操作系统的发展不仅代表了技术的进步,更是用户体验革新的前沿。本文深入探讨了安卓和iOS这两大主流操作系统的未来走向,特别是它们在技术融合与创新方面的可能性。通过分析当前的市场需求、技术挑战和潜在的发展机会,我们将展望一个可能出现的未来场景:一个结合了安卓开放性和iOS优雅体验的双系统融合平台。这不仅仅是对技术极限的挑战,更是对用户体验极致追求的一次探索。
37 2