手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表分类:苹果相关

转:Emoji表情符号兼容方案

Emoji,原来的项目中没有遇到,因为从未想过别人会从网页里发送表情(表情 信息是从iphone手机上发出来的),查了一下资料,果然很多人遇到了这个问题。不过也幸好有了解决方案了。。。

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>

大小: 568.34 K
尺寸: 494 x 376
浏览: 1649 次
点击打开新窗口浏览全图

二 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语句:

XML/HTML代码
  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代码

XML/HTML代码
  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代码
  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编码)

参考:禁用 UIWebView 里面的链接长按弹出效果

张宴在他的博客里说到:苹果一直拒绝 UIWebView 内嵌 HTML5 页面的 iPhone、iPad APP应用上架到 App Store,建议这样的APP去做成Safari的Web应用
但是,他用另外的办法解决了这个小问题,即不让别人感觉到HTML5页面可以被touch:

XML/HTML代码
  1. 1、URL不让直接通过浏览器访问(UIWebView的请求Header头中加点东西,在服务器端将APP内嵌的访问和通过直接浏览器访问区分开来),或者通过浏览器访问时,返回JSON、XML信息,输出“Interface Error”,忽悠苹果审核人员说这是HTTP协议的接口,不是网页。  
  2.   
  3.   2、禁用、禁止 UIWebView 里面的链接长按弹出效果。加入一行 CSS 代码,禁用类似下图的链接长按弹出效果:  
  4. html,body{-webkit-touch-callout: none;}  

以前没有注意过这些,以前只是注意到连续的数字会被当成电话可以被Call。所以只是加了一个telphone=no。黑黑。。
反正先了解一下总是好的。

转:智能APP的Banner

这是最近的一个小热点,即在网页的meta里加入一行代码:<meta name="apple-itunes-app" content="app-id=1234567890"/> ,红色区域就是你的APP的ID
不知道,有两个APP的情况下,即加入两条的时候会怎么样?
不过,目前该功能只支持Safari,而且是IOS上的Safari,看来IOS6中,对safari加了好多功能啊。

记录下这个,也是做个笔记。

Tags: ios

IOS6,我是升呢还是不升呢

IOS6的改动列表非常大,你说我是升呢还是不升呢?
因为IOS我还是越狱了,为了两个软件:1、issh,太贵了,不过这个可以买;2、zephyr,这个APP好啊。。。直接iphone支持手势了(否则只有IPAD支持)
刚才一下子看到itunes给的升级列表,我就复制了下来。。。。好纠结,你说我该不该升?升的话,HOME键就又得拼命按了。
iOS 6 软件更新

本更新包含超过 200 项新功能,其中包括:

•  地图
◦  Apple 设计的基于矢量的地图
◦  在 iPhone 5、iPhone 4S、iPad WLAN + Cellular(第 2 代和第 3 代)上实现带语音提示的路线规划导航
◦  实时交通路况信息
◦  Flyover 在 iPhone 5、iPhone 4S、iPad(第 3 代)和 iPod touch(第 5 代)上将主要城市区域以照片般真实的互动式 3D 视图呈现
◦  本地搜索结果附带 Yelp 照片、评分、评论和优惠信息
◦  Siri 集成到获取路线和查找沿线地点的功能中
•  Siri 改进
◦  运动:棒球、篮球、橄榄球、足球和冰球比赛的比分、球员技术统计、赛程、球队阵容和联赛排名
◦  影片:预告片、上映排期、评论和剧情介绍
◦  餐馆:预订、评论、照片等信息
◦  发送推文
◦  发布在 Facebook 上
◦  启动应用程序
◦  在支持的车型上实现免视导航 (Eyes Free)
◦  支持 Siri 的国家/地区都可以使用本地搜索功能(推出初期,可用性可能受限制)
◦  更多国家/地区及语言支持:加拿大(英语和加拿大法语)、中国(普通话)、香港(粤语)、意大利(意大利语)、韩国(韩语)、墨西哥(西班牙语)、西班牙(西班牙语)、瑞士(意大利语、法语和德语)、台湾(国语)以及美国(西班牙语)
◦  支持 iPhone 5、iPhone 4S、iPad(第 3 代)和 iPod touch(第 5 代)
•  Facebook 集成
◦  在“设置”中单次登录
◦  从“照片”、Safari、“地图”、App Store、iTunes、Game Center、“通知中心”和 Siri 直接发布
◦  给任意发布添加位置信息和选择观众
◦  在“通讯录”中查看最新的 Facebook 个人主页照片和联系人信息
◦  在“日历”中查看 Facebook 事件和生日提醒
◦  称“赞”内容和查看朋友们在 App Store 和 iTunes Store 中称“赞”的内容
•  共享的照片流
◦  将选定照片共享给您选择的人
◦  朋友们可以在“照片”应用程序、iPhoto 和 Apple TV 中查看共享的照片
◦  朋友们可以称“赞”并给单独的照片添加评论
•  Passbook
◦  集中管理登机牌、购物卡、电影票和其他凭证
◦  以条形码显示用于登机、购买咖啡、去影院看电影等活动的凭证
◦  凭证会根据时间或位置显示在锁定屏幕上
◦  凭证可自动更新
◦  支持 iPhone 和 iPod touch
•  FaceTime 改进
◦  iPhone 5、iPhone 4S 和 iPad WLAN + Cellular(第 3 代)支持通过蜂窝移动网络进行 FaceTime 通话
◦  在 iPad 和 iPod touch 上接收拨给您的 iPhone 号码的 FaceTime 呼叫
•  电话改进
◦  “勿扰模式”可让您免受来电和通知的打扰
◦  拒绝来电时提供“以信息回复”选项
◦  拒绝来电时根据时间或位置提供“稍后提醒我”选项
•  邮件改进
◦  VIP 邮箱可让您快速找到重要人士的邮件
◦  有旗标电子邮件的专用邮箱
◦  编写电子邮件时可插入照片和视频
◦  打开受密码保护的 Office 文稿
◦  下拉即可刷新邮箱
◦  各个帐户独有签名
•  Safari 改进
◦  iCloud 标签可看到您所有设备上打开的页面
◦  离线阅读列表
◦  照片上传支持
◦  在 iPhone 和 iPod touch 上支持全屏幕横排视图
◦  智能应用程序横幅
◦  JavaScript 性能提升
•  App Store 和 iTunes Store 改进
◦  更新的商店设计
◦  iTunes 预览历史记录
◦  补齐我的整季
◦  补齐我的专辑
•  Game Center 改进
◦  挑战朋友赢得的高分和成就
◦  将所获得的高分和成就发布到 Facebook 和 Twitter
◦  基于您的 Facebook 朋友推荐朋友
•  辅助功能改进
◦  “引导式访问”可将设备限制为使用一个应用程序,或者限制某些屏幕区域上的触碰输入
◦  VoiceOver 与“地图”、AssistiveTouch 和“缩放”功能集成
◦  iPhone 5 和 iPhone 4S 支持“Made for iPhone”助听器
•  增强了“通讯录”、“日历”、“提醒事项”、“照片”以及通过蓝牙共享数据时的隐私控制
•  “提醒事项”应用程序中的提醒事项可被重新排序
•  在 iPhone 上自定振动提醒方式
•  适用于 iPad 的“时钟”应用程序
•  以歌曲作为时钟闹铃
•  在“通讯录”中搜索所有字段
•  自动影片模式实现更强的视频声音质量
•  中文、法文、德文和西班牙文的字词定义
•  适用于法文、德文、土耳其文、加泰罗尼亚文、阿拉伯文和冰岛文的全新键盘布局
•  键盘快捷键可通过 iCloud 在设备间共享
•  蓝牙 MAP 支持
•  HTTP 全局网络代理
•  中国定制功能

◦  百度网页搜索
◦  新浪微博集成
◦  将视频共享到土豆网
◦  将视频共享到优酷网
◦  改进了手写和拼音输入法
•  修正了一些错误

某些功能可能并不适用于所有国家或地区。更多详细信息,请访问此网站:
    http://www.apple.com/ios/feature-availability

有关本更新的安全性内容的信息,请访问此网站:
    http://support.apple.com/kb/HT1222?viewlocale=zh_CN

Tags: ios

纠结:屏幕突然出现一道蓝色细线,求解!

纠结啊,今天早上突然发现屏幕好象有点不太一样。看了一下,居然边上有一条蓝色的线。。。
开始以为是程序有问题重启后发现线还在
google了一下,发现也有类似人发生了类似的事情:http://www.macx.cn/thread-1710539-1-1.html
苦逼了这回。。