emoji处理

Emoji 实战问题:iOS,Android,Server

2016-05-27 11:34 编辑: lansekuangtu 分类:iOS开发 来源:lu5914018 投稿

10 15960

iOSAndroidEmojiServer

招聘信息:

iOS开发工程师

iOS高级开发工程师

Cocos2d-x开发工程师

手游服务器开发工程师(C++)

Android / iOS / Web / Backend 资深开发工程师

iOS 开发工程师(实习)

iOS开发工程师

产品经理

cocos2d-x休闲游戏开发

Java工程师

Mac开发

前言

关于emoji,有的同学会很奇怪,为什么要特意写这个,原生的本来不就支持了emoji输入以及显示吗?的确,原生的控件都支持emoji的显示以及输入。但是有的需求一旦进入了开发阶段,你就会发现并不是那么简单的一件事情。

Server端:

由于server一开始并不支持emoji,现在你post含有emoji的数据到server,server会出现异常,主要是server的mysql开始的时候没有定义4位的字段,varchar都是3位的(普通的字符串或者表情都是占位3个字节,所以utf8足够用了,但是移动端的表情符号占位是4个字节,普通的utf8就不够用了,为了应对无线互联网的机遇和挑战、避免 emoji 表情符号带来的问题、涉及无线相关的 MySQL 数据库建议都提前采用 utf8mb4 字符集,这必须要作为移动互联网行业的一个技术选型的要点)。

Android端:

大家都知道,Android和iOS的表情显示是不一样的(Android的更萌,不信去试试),据说Android N的推出使Android的emoji更加像iOS的了。图不同编码相同倒不是什么问题,致命的是我们需要做得和微信那样,emoji表情保持一致性,而且Android里面的输入法(例如搜狗)键盘显示的是iOS样式的(emoji最原始样式),想一下如果用户输入的和看到的是不一样的会是什么样的体验?所以我们这里必须拿emoji出来处理!而且和iOS一样需要做过滤处理!这里的过滤处理主要是过滤掉iOS8.3推出的肤色。但是本文提到的Android库里面包含了肤色,所以如果Android需要显示肤色的话,可以不用过滤,对了,就算你可以显示带肤色的emoji,你是输入不了的,因为Android的输入法不支持输入带肤色的emoji。更多处理请看下面。

iOS端:

别以为iOS端自带了emoji就轻松,因为需要做和server端,Android的一致性,我们这里需要将emoji转化为共用的字符(下文会知道他们是以两个“:”来定义的例如 :emoji:),除开兼容,我们还要做emoji的过滤!emoji的列表不是一成不变的!在不同的版本苹果都会推出新的emoji,也就是说emoji是动态的!参考微信朋友圈的实现我们就知道,在一些低版本的设备中不支持高版本的emoji的话微信会直接过滤掉!所以我们这里也需要做过滤处理!更多处理请看下面。

走过的弯路

参考文献:iOS & Android:

解决方案:

https://github.com/arvida/emoji-cheat-sheet.com/

https://github.com/quxionglie/emoji-convertor

http://blog.csdn.net/qdkfriend/article/details/7576524

http://www.cnblogs.com/YungMing/p/5080437.html

emoji过滤(用于缺失定义的emoji): http://www.pigg.co/emoji-filter.html

iOS:

http://jeason.gitcafe.io/blog/iOS+Anroid+Emoji/

http://cenalulu.github.io/linux/character-encoding/

emoji编码范围:http://blog.csdn.net/liujinlongxa/article/details/44207003

ANDROID:

https://github.com/rockerhieu/emojicon

SERVER:

升级数据库:https://segmentfault.com/a/1190000000616820

用于前端网页显示emoji:https://github.com/pepibumur/emojize

EMOJI列表:

http://apps.timwhitlock.info/emoji/tables/unicode

http://www.emoji-cheat-sheet.com/

https://en.wikipedia.org/wiki/Emoji

http://punchdrunker.github.io/iOSEmoji/table_html/index.html

工具库:(GITHUB上STAR最多的)

iOS:

https://github.com/valeriomazzeo/NSString-Emoji

https://github.com/diy/NSStringEmojize/

ANDROID:

https://github.com/rockerhieu/emojicon

MAC OS X 查看所有EMOJI图片的方法:

快捷键:control + command + 空格

弹出如下图:

点击左上角设置按钮–>自定义列表—>勾选Unicode—>点击完成。

就可以看到完整emoji列表和对应的Unicode码或者UTF-8码了。

遇到的问题:iOS端从iOS8.3开始出现的emoji肤色

最终的解决方案

Android:

使用工具:https://github.com/rockerhieu/emojicon

安卓的同学比较懒,没有写文字的习惯。故这里我仅贴出工具。

iOS:

使用工具库:https://github.com/valeriomazzeo/NSString-Emoji

注意:

这个工具里面的emoji字符表不全,需要自己新增一些进去。

这个工具里面没有iOS8.3开始Apple新增的emoji肤色选择!

没有使用另外一个cheat-emoji官方工具的原因是官方工具只是将“:test:”等字符的转化为emoji,但是却缺少了将emoji反转成“:test:”的方法!!。想想也是醉了!

我这里给出肤色对应的编码:

1

2

3

4

5

6

7

8

9

//by Vbon haha

//here is emoji color unicode sinces iOS8.3

//default is not containt color unicode which look like yellow color sinces iOS8.3

//Before iOS8.3 emoji is no color unicode containt and look like white color.

@"??": @":skinColor1:",//white             --> Unicode: U+1F3FB

@"??": @":skinColor2:",//white&littleBrown --> Unicode: U+1F3FC

@"??": @":skinColor3:",//white&deepBrown   --> Unicode: U+1F3FD

@"??": @":skinColor4:",//brown             --> Unicode: U+1F3FE

@"??": @":skinColor5:"//black             --> Unicode: U+1F3FF

注意一点:emoji的不断新增!

iOS&Android的同学注意了!

由于emoji会不断新增,也就是说emoji的Unicode范围会一直增大!所以需要做一下处理,对于不在自己代码定义的范围内的emoji需要过滤掉!例子:微信朋友圈。

小道消息称Unicode协会将会在明年新增多150个emoji,具体时间还没定。新增表情对于大家的使用时很爽!(例如iOS9后多了个中指的表情)。但是对于我们程序本身来说就意味着必须要做emoji字库和对应的key不全的问题的处理!就算以后他新增1000个我也无所谓了!因为我是按照微信的做法(直接忽略没有的emoji,不信你试试在iOS端发????这个emoji,去Android设备看看,你就知道了,微信是直接过滤掉的!)。下面我直接点,贴代码,大家直接拿去用。

注意:这里的代码是结合上面的工具来用的。

Android:

工具:https://github.com/rockerhieu/emojicon

修改工具里面的编码:

安卓的同学需要特别注意两点:

这个emoji库是通过不断对比map里面的数据来查询的,会导致在列表中的多emoji时滚动会很卡。解决办法:在得到列表json数据的时候,在映射的时候转码成emoji,并将该emoji直接放入实体。这样就避免了滚动list的时候转码带来的卡顿!

在输入emoji的地方(发表内容),连续输入多个emoji会卡顿甚至卡死,原因同上,因为这个库是对比查找的,默认的算法是假如有1000个emoji,那么就1个emoji的key对比1000次,而输入的时候由于每次输入都进行了转码,所以输入一个emoji就要对整段text进行emoji对比。性能严重下滑!解决办法是改变自己的算法,只转码新输入的那个字符。

总的来说就是特殊场景特殊处理,看自己的解决问题的能力了!

iOS:

工具:https://github.com/valeriomazzeo/NSString-Emoji

修改工具里面的编码:

需要注意的几种情况:

上传字符串前需要将字符串使用工具转码。

用户输入字符串的时候看情况是否需要转码。

如果有字数限制的!注意emoji转码带来的字数问题哟!

安卓的同学注意了!上面推荐的工具是十分强大的!里面包括了iOS的肤色emoji。需要和iOS端沟通处理。例如我这里用skinColor1-5来区分除了默认颜色(白种人)的之外的5中颜色。安卓也是需要定义这几种编码的!用于过滤或者显示不同肤色!

(更新:2016.5.12)

测试今天发来了bug,说是有的字符没过滤掉。我看了一下的确,在iOS9.3开源的代码中没有添加进去一些新的emoji。而且值得注意的是:新增的emoji中竟然出现了新的[emoji语法]!!!新增了同性之间的emoji和家庭的emoji有着不同的语法!一个emoji可能有很多个编码。

例如:“????????????” 这个emoji表示的是女女之间的同志关系。

你会发些这一类emoji竟然连控制台也打印不出来!(我的系统是最新的10.11.4)。

打开emoji列表,我们可以看到他的编码语法。

总共由6个4字节的编码组成!比以前的最多3个4字节编码翻了一倍!

细心的同学可以在上面控制台的图片里面发现一些端倪,上面6个4字节组成的实际上可以用已经有的emoji进行翻译!像“????????????”翻译过来就是:woman::heart::woman:,看是不是通俗易懂?至于中间的“?”号我们可以看回emoji列表里面的字节是什么,可以知道的是“U+200D”这样的东西。这样就好办了,我们可以将它转换成“U0000200D”,那样程序就知道了。由于安卓没有这样新增的图片我们只好过滤掉这样的东西了。在文件中新增key-value如下:

这样就可以完美过滤了。

我在新增iOS9.3 emoji的过程中发现文件中的emoji国旗没有多少支持。

对比系统emoji列表可以在文件中新增进去。

这样就可以将app的emoji支持到最新的iOS9.3了。

为了大家方便我将文件开源到这里:https://github.com/vbonluk/iOS_Emoji

文件随着系统升级及时更新,欢迎star。谢谢

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容