原文地址:http://blog.csdn.net/ugg/article/details/44225723

emoji资料

今天研究了emoji,挺有意思,资料挺多,摘要一些信息给大家分享,也算是自己记录学习。

emoji介绍

Emoji (絵文字,词义来自日语えもじ,e-moji,moji在日语中的含义是字符)是一套起源于日本的12x12像素表情符号,由栗田穣崇(Shigetaka Kurit)创作,最早在日本网络及手机用户中流行,自苹果公司发布的iOS 5输入法中加入了emoji后,这种表情符号开始席卷全球,目前emoji已被大多数现代计算机系统所兼容的Unicode编码采纳,普遍应用于各种手机短信和社交网络中。近期,更是有不少网友用emoji图案玩猜字游戏,享受这种表情文化带来的乐趣。

关于emoji的发音:很多人第一眼见到emoji便会下意识将其误读作“一磨叽”,其实不然,emoji音译过来大概读作“诶磨叽”,当中“e”的发音颇似字母abc的a的发音。

最初日本的三大电信运营商各自有不同的字符定义,分别是DoCoMo、KDDI和Softbank。随着iOS内置了Softbank的版本,emoji在全球范围内风靡(iOS5版本以前)。而Google又自己定义了一套emoji字符。iOS5以后,apple采用了unicode定义的emoji字符(iOS5版本以后)。

unicode定义的emoji是四个字符,softbank为3个字符,emoji的四个字符从存储到展示对应没有做过考虑的系统来说,简直就是灾难。

面临问题:

插入Emoji表情,保存到数据库时报错:

SQLException: Incorrect string value: '\xF0\x9F\x98\x84' for column 'review' at row 1

UTF-8编码有可能是两个、三个、四个字节。Emoji表情是4个字节,而Mysql的utf8编码最多3个字节,所以数据插不进去。

解决方案:过滤解决

把emoji直接过滤掉,简单方便有效。虽然损失了几个emoji字符,但强过不至于导致整条记录丢失。

[php] view plaincopy
  1. public static String removeNonBmpUnicode(String str) {
  2. if (str == null) {
  3. return null;
  4. }
  5. str = str.replaceAll("[^\\u0000-\\uFFFF]", "");
  6. return str;
  7. }

这种方案能预防能解决问题,并且还能是程序更加健壮,但是从用户体验上来说并不好,用户发的emoji表情丢了,看下面的解决方案。

解决方案:将Mysql的编码从utf8转换成utf8mb4。

从 MySQL 5.5.3 开始,MySQL 支持一种 utf8mb4 的字符集,这个字符集能够支持 4 字节的 UTF8 编码的字符。 utf8mb4 字符集能够完美地向下兼容 utf8 字符串。在数据存储方面,当一个普通中文字符存入数据库时仍然占用 3 个字节,在存入一个 Unified Emoji 表情的时候,它会自动占用 4 个字节。所以在输入输出时都不会存在乱码的问题了。

要使用 MySQL 的这个特性,首先需要把 MySQL 升级到 5.5.3 以上的版本。

其次,需要修改数据结构中的字符集为 utf8mb4 ,如 utf8mb4_general_ci 。由于 utf8mb4 是 utf8 的超集,从 utf8 升级到 utf8mb4 不会有任何问题,直接升级即可;如果从别的字符集如 gb2312 或者 gbk 转化而来,一定要先备份数据库。

然后,修改 MySQL 的配置文件 /etc/my.cnf,修改连接默认字符集为 utf8mb4 ,如果是自己写的 PHP 脚本,也可以在连接数据库以后首先执行一句 SQL: SET NAMES utf8mb4;。这时候,PHP 应该就可以正常保存 Emoji 到数据库了。

这种方式可能带来的问题:

存储:在数据表中,对于变长的字段(如VARCHAR2,TEXT),utf8mb4最大可存储的字符可能少于utf8系列的collation;在索引中,对于文本类型的字段,utf8mb4可索引的字符少于utf8系列的collations。如InnoDB的索引最多使用767字节。如果使用utf8mb4,每一个字符都会预留4字节做索引,而utf8则预留3字节。故此前者是191个字符,后者是255个字符。。

性能:由于以上原因,加上字符集大,utf8mb4的性能可能比utf8系列的collations低,可以参考stackoverfolow上的一个测试结果:http://stackoverflow.com/questions/766809/whats-the-difference-between-utf8-general-ci-and-utf8-unicode-ci,差异不是特别大。

运维:如果一个大的环境内,如果其他的数据库都是utf8模式,把其中某个库设置为utf8mb4模式,在后续交接运维可能会造成问题,遗留下坑。

上下游:数据库支持unicode的emoji存储,上下游不一定支持。比如mysql客户端驱动(低版本的jdbc就不行)可能不支持utf8mb4,或者DDL的中间件不支持utf8mb4。web端处理utf8mb4字符展示,这些都有可能影响emoji的存储活着展示。

从上面的信息,从数据库层面如果不是特别看重存储,性能,运维并能解决上下游的问题,数据库是完全可以支持emoji的,但是有个新问题没有解决,emoji在iOS上展示OK,andriod设备如何展示emoji表情?

解决方案:转义解决

1:unicode emoji转softbank的emoji。

我们知道unicode emoji是4个字节,softbank定义的emoji占用3个字节存储,通过emoji for php http://code.iamcal.com/php/emoji/,我们可以把unicode的emoji方式转换为softbank方式,从而实现不修改数据库,就能存储emoji,相对于数据库层面的解决问题的方式,动作要小的多,并且也不会有性能,运维等方面的问题。但是有个不可避免的问题是,Softbank方式已经不再维护,所以新增加的emoji表情,Softbank中都没有,会造成部分emoji表情丢失的情况。

2:ubb

UBB代码是HTML(标准通用标记语言下的一个应用)的一个变种,是Ultimate Bulletin Board (国外的一个BBS程序)采用的一种特殊的TAG。您也许已经对它很熟悉了。UBB代码很简单,功能很少,但是由于其Tag语法检查实现非常容易,所以不少网站引入了这种代码,以方便网友使用显示图片/链接/加粗字体等常见功能。

比如emoji的太阳符号,他的unicode emoji编码为U+2600,在存入数据库时,可以把它转换成  UBB 代码 [emoji]2600[/emoji] 保存,读取的时候,可以转换回来。当然针对不同的设备,比如andriod我们可以转义成andriod可以处理的emoji符号。

这种转移,可以很好解决iOS和Andriod显示emoji的问题,但是还存在几个问题。

1:andriod和iOS的emoji并不相同,相同的编码 可能在iOS上是太阳,而在andriod上是阴天,解决这种问题方式最好做下iOS和andriod下的emoji映射,同时可以在web上通过js转义处理。

2:性能,采用转义的方式处理,性能肯定会有所下降,但是可以容忍。

与UBB对应的是html转义,这种方式,其实和ubb有些类似, 使用 HTML转义字符 ☀,结果和性能和UBB差不多,从规范化上来说,ubb方式更好一些。

参考资料

PHP-emoji转换表:http://code.iamcal.com/php/emoji/
unicode Emoji Symbols: http://www.unicode.org/~scherer/emoji4unicode/20091221/utc.html
emoji图标和unicode对应关系:http://www.easyapns.com/iphone-emoji-alerts
谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词:http://www.fmddlmyy.cn/text6.html
emoji在线转换工具:http://unicodey.com/js-emoji/demo.htm
Emoji表情图标在iOS与PHP之间通信及MySQL存储:http://blog.csdn.net/wildfireli/article/details/9370161
Mysql中校对集utf8_unicode_ci与utf8_general_ci的区别:http://hi.baidu.com/phpkoo/item/38238bd8505899e955347fca,http://stackoverflow.com/questions/766809/whats-the-difference-between-utf8-general-ci-and-utf8-unicode-ci
Mysql排序规则utf8_unicode_ci与utf8_general_ci的区别:http://justdo2008.iteye.com/blog/2162842
Unicode Character Sets:http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-sets.html
MySQL设置utf8mb4编码:http://www.linuxidc.com/Linux/2014-07/104231.htm|
andriod支持emoji解决方案:http://blog.csdn.net/waylife/article/details/11095113
Supporting New Emojis on iOS 6:http://blog.manbolo.com/2012/10/29/supporting-new-emojis-on-ios-6
让MySql支持Emoji表情(MySQL中4字节utf8字符保存方法):http://www.w2bc.com/Article/8533
如何处理emoji等4字节的Unicode字符:http://zhidao.baidu.com/link?url=z6PW1ya6plRBgFN7M2zdVLXUnmxYcH2_VYK8nW9Yi9-kh2estgmJomw1LssmsA853WYHsRtulkJn2okq0a3TAUDQHIiMe7b0VS-FeGMNYUu
suppoting new emoji for ios6:http://blog.manbolo.com/2012/10/29/supporting-new-emojis-on-ios-6 
UTF-8格式emoji:http://punchdrunker.github.io/iOSEmoji/table_html/ios6/index.html

Emoji处理方式大起底相关推荐

  1. 东莞厚街工业机器人展会_展会效果大起底2020东莞厚街机械展暨2020东莞国际工业自动化及机器人展览会...

    原标题:展会效果大起底2020东莞厚街机械展暨2020东莞国际工业自动化及机器人展览会 也是最好的营销引爆点! 为此,不少企业深谙此道纷纷入局 最后喧嚣落幕 钱.时间.经历都花出去了 而客户.订单一样 ...

  2. oracle建立覆盖索引,oracle索引类型及扫描方式大整理

    oracle索引类型及扫描方式大整理 1. 存储类型 索引在各种关系型数据库系统中都是举足轻重的组成部分,其对于提高检索数据的速度起至关重要的作用.在Oracle中,索引基本分为以下几种:B*Tree ...

  3. 乔布斯的中国门徒 黄章和雷军恩怨大起底

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴!     ...

  4. 乔布斯的中国门徒:黄章和雷军恩怨大起底

        乔布斯辞任苹果CEO的消息在此岸的中国手机圈一石激起千层浪.最吸引眼球的就是乔布斯的两位中国门徒的频繁"出位". 一个是被冠以"雷布斯"称号的雷军.另一 ...

  5. JavaScript函数实现方式大总结

    JavaScript函数实现方式大总结,众多的函数实现方式中,你现在用的是哪种? 一:例子需求分析 实现表单验证功能,验证用户名.邮箱.密码. 二:实现方案(13种) ①:全局函数方式 functio ...

  6. 算法岗百里挑一热爆了,全球AI大厂薪酬大起底

    ↑ 点击上方[计算机视觉联盟]关注我们 认识到算法的重要性之后,还需要认识一下算法到底有多火. 前段时间,AI大厂字节跳动招聘收到的算法工程师的简历数量远超需求,而安卓.iOS简历却十分稀缺:后端.前 ...

  7. 计算机考研408-I/O方式大题答题流程

    I/O方式大题 一 程序查询流程 程序运行scanf代码,此时发生系统调用,操作系统等待来自键盘的字符 程序查询方式不断轮询查看是否有字符输入(注意:不会一直占用处理机导致系统死机,参考并发概念,仅在 ...

  8. 手机回收价格大起底,换换回收分析为什么“破烂”也值钱?

    当下我们的生活每天都在发生变化,会观看各种搞笑逗趣的短视频,欣赏更多新鲜好玩的段子,发现各种光怪陆离的八卦,而让我们接收到这些稀奇古怪的信息媒介就是我们每天都形影不离的手机.我们对手机的关注度越来越高 ...

  9. java舞会配对程序_校会·活动 | 舞会流程及配对方式大揭秘

    原标题:校会·活动 | 舞会流程及配对方式大揭秘 "May I Dance With You?" 春季联谊舞会进入倒计时1周 放下你的羞涩与顾虑 一周后 你能在舞池中伴着弦乐团现场 ...

最新文章

  1. Linux文件的权限[srwxr-xr-x]
  2. Docker将在存储上崭露头角?
  3. Selection change event Issue is fixed handleListItemPress,SingleSelectMaster
  4. 从一般到特殊-C#中的对象
  5. 如何兼容html在不同分辨力的问题,现代教育技术练习题
  6. framebuffer驱动详解0——framebuffer介绍
  7. 【一鸣离职,左晖去世】互联网老兵给大家的三个建议
  8. 【重难点】【分布式 01】RESTful、RPC 对比、Dubbo、Spring Cloud 对比、Eureka、Zookeeper、Consul、Nacos 对比、分布式锁
  9. Docker学习文档之二 搭建环境-Linux环境
  10. 电平转换电路_RS232电平和TTL电平有什么不同?如何转换?
  11. MySQL(用户管理,常用sql语句,数据库备份恢复,MySQL调优,恢复误操作数据)...
  12. 关于Session、Cookie、Token你知道多少?
  13. 五款PC端小说阅读器 readbook、非常酷阅读器、iSilo、AlReader、haalireader
  14. access 江苏计算机二级_关于江苏省计算机二级MS OFFICE考试的建议
  15. 中央电大 c语言程序设计a 试题,中央电大208年秋C语言程序设计A试题1.doc
  16. 区块链+人工智能+大数据等技术能否让我们构建三体文明
  17. 小程序如何本地去水印,基于很多小白写的教程
  18. java代码获取本周的开始日期和结束日期,并动态获取前几周的或者后几周的开始日期和结束日期。
  19. WLAN网络配置,vlan内漫游
  20. VUE的el和data的写法以及MVVM模型、VUE的数据代理

热门文章

  1. 现在开始 · 入门编程
  2. 前端如何拥有自己的服务器
  3. 广州市番禺区2021-2022学年九年级第一学期期末考试英语试题
  4. CentOS 7部署Oracle数据库
  5. 一打卡作弊软件被指破坏钉钉系统:CEO 被判 5 年 6 个月
  6. C#串口通信数据不完整
  7. IDNA-ABF: DNA甲基化可解释预测的多尺度深度生物语言学习模型
  8. pythonsl火车加字_荐Python实现Radon变换——直接反投影和滤波反投影
  9. javascript数据类型边边角角
  10. 关于如何向老板提涨工资