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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 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/
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
JavaScript 前端开发 Android开发
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
81 13
【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
1月前
|
安全 Android开发 数据安全/隐私保护
Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
62 12
Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
|
1月前
|
JavaScript 搜索推荐 Android开发
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
70 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
|
1月前
|
数据采集 JavaScript Android开发
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
63 7
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
1月前
|
缓存 Java 测试技术
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
203 3
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
|
3月前
|
存储 监控 API
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
141 11
|
3月前
|
IDE 开发工具 Android开发
移动应用开发之旅:探索Android和iOS平台
在这篇文章中,我们将深入探讨移动应用开发的两个主要平台——Android和iOS。我们将了解它们的操作系统、开发环境和工具,并通过代码示例展示如何在这两个平台上创建一个简单的“Hello World”应用。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和技巧,帮助你更好地理解和掌握移动应用开发。
114 17
|
3月前
|
开发框架 Android开发 iOS开发
安卓与iOS开发中的跨平台策略:一次编码,多平台部署
在移动应用开发的广阔天地中,安卓和iOS两大阵营各占一方。随着技术的发展,跨平台开发框架应运而生,它们承诺着“一次编码,到处运行”的便捷。本文将深入探讨跨平台开发的现状、挑战以及未来趋势,同时通过代码示例揭示跨平台工具的实际运用。
199 3
|
3月前
|
安全 生物认证 Android开发
深入探索iOS与Android操作系统的安全性差异
本文旨在通过对比分析iOS和Android两大主流移动操作系统在安全性方面的差异,揭示它们各自的安全机制、面临的挑战以及用户如何提升自身设备的安全保护。通过对系统架构、应用审核机制、数据加密方式及隐私政策的深入探讨,本文为读者提供了一个全面了解两大平台安全性的视角,并提出了实用的安全建议。
|
3月前
|
开发工具 Android开发 iOS开发
Android与iOS生态差异深度剖析:技术架构、开发体验与市场影响####
本文旨在深入探讨Android与iOS两大移动操作系统在技术架构、开发环境及市场表现上的核心差异,为开发者和技术爱好者提供全面的视角。通过对比分析,揭示两者如何塑造了当今多样化的移动应用生态,并对未来发展趋势进行了展望。 ####

热门文章

最新文章

  • 1
    苹果app上架app store 之苹果开发者账户在mac电脑上如何使用钥匙串访问-发行-APP发布证书ios_distribution.cer-优雅草卓伊凡
    39
  • 2
    uniapp云打包ios应用证书的获取方法,生成指南
    38
  • 3
    iOS|解决 setBrightness 调节屏幕亮度不生效的问题
    123
  • 4
    iOS|记一名 iOS 开发新手的前两次 App 审核经历
    29
  • 5
    iOS各个证书生成细节
    39
  • 6
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    203
  • 7
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    62
  • 8
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    81
  • 9
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    63
  • 10
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    70