Android 微信对 emoji 的支持是不是很差?为何这样设计
2个回答
2015-05-29 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
向TA提问 私信TA
知道合伙人数码行家
采纳数:117538
获赞数:517189
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。
向TA提问 私信TA
关注
展开全部
Emoji从最早开始到现在,比较通用的是两种编码方案,分别是Softbank和Unicode,android版微信早期也是使用Softbank编码,然后客户端根据表情对应的Softbank编码使用SpannableString在TextView, EditText中显示成对应的表情,此时Emoji表情的集合还不是很多,微信只打包进去了大概400多个左右,在早期可以满足大部分Emoji表情的显示需求
但是,随着Unicode 6.0以及Unicode 7.0的发布,越来越Emoji表情被加入到这个标准当中,iOS系统自行扩展OpenType标准,通过Apple Color Emoji.ttf这个字体来讲Emoji表情直接显示出来(OSX下也有这个字体,在/System/Library/Fonts/Apple Color Emoji.ttf),当时国外也有对这个问题进行过讨论:Color bitmapfonts... thanks to Apple?! ,但是,由于新加进来的表情都没有对应的Softbank编码,无法转码成Softbank,并且客户端在打包的时候只放进了400多个Emoji表情,所以在显示的时候,只能转换成".."来显示
后来,随着越来越多表情不能显示,我们这边曾经颤橘尝试过直接在客户端使用unicode编码,并尝试过一次对外的灰度,在灰度的过程中,我们发现了一些crash,占的总量还不低,crash的堆栈大概是这样的:
at android.text.SpannableStringInternal.getChars(SpannableStringInternal.java:102)
at android.text.TextUtils.getChars(TextUtils.java:105)
at android.text.Layout.processToSupportEmoji(Layout.java:3747)
at android.text.Layout.supportTabandEmoji(Layout.java:3783)
at android.text.Layout.measureText2(Layout.java:3141)
我们注意到了 processToSupportEmoji 这个方法,明显不是属于Android系统原有的方法,应该是某些rom自行更改出现的问题,google一下,果不其然,在某些MTK的rom中有这样的一段代码,是属于processToSupportEmoji中的:
...
int length = end - start +1;
char[] chs = TextUtils.obtain(length);
TextUtils.getChars(text, start, end, chs, 0);
for (int i = start ; i < end; i++) {
char c = chs[end-start];
if (c >= 0xD800 && c <= 0xDFFF && i + 1 < length) {
char[] tmp = TextUtils.obtain(2);
TextUtils.getChars(text, i, i+2, tmp, 0);
....
可以看出这段代码对数据越界的保护是错误的,很容易就crash,有兴趣可以看下这篇文章:Android程序自动退但是没有提示任何错误
发生这个crash的大部分都是2.3系统的手机,也有一部分是4.x,sony的仿宏一些机器也有,估计是复用了同一份代码。
备洞册So,问题的答案到这里就很明显了,将部分表情替换成点点的原因主要是这样的:
1. 大部分新表情都没有对应的unicode编码,而换了unicode编码,TextView/EditText直接显示在一些机器中就会遇到上面的crash
2. 考虑到安装包的大小,目前也没有把太多表情直接打包进去的打算(从目前版本的OSX中提取出来的表情大概有800多个,全部直接打包进去的话,会给安装包增加1~2M的体积)
BTW,Google在4.4之后也自行扩展了OpenType标准,同时也添加了一套自己的小黄人Emoji表情,可以直接在Google输入法中输入
但是,随着Unicode 6.0以及Unicode 7.0的发布,越来越Emoji表情被加入到这个标准当中,iOS系统自行扩展OpenType标准,通过Apple Color Emoji.ttf这个字体来讲Emoji表情直接显示出来(OSX下也有这个字体,在/System/Library/Fonts/Apple Color Emoji.ttf),当时国外也有对这个问题进行过讨论:Color bitmapfonts... thanks to Apple?! ,但是,由于新加进来的表情都没有对应的Softbank编码,无法转码成Softbank,并且客户端在打包的时候只放进了400多个Emoji表情,所以在显示的时候,只能转换成".."来显示
后来,随着越来越多表情不能显示,我们这边曾经颤橘尝试过直接在客户端使用unicode编码,并尝试过一次对外的灰度,在灰度的过程中,我们发现了一些crash,占的总量还不低,crash的堆栈大概是这样的:
at android.text.SpannableStringInternal.getChars(SpannableStringInternal.java:102)
at android.text.TextUtils.getChars(TextUtils.java:105)
at android.text.Layout.processToSupportEmoji(Layout.java:3747)
at android.text.Layout.supportTabandEmoji(Layout.java:3783)
at android.text.Layout.measureText2(Layout.java:3141)
我们注意到了 processToSupportEmoji 这个方法,明显不是属于Android系统原有的方法,应该是某些rom自行更改出现的问题,google一下,果不其然,在某些MTK的rom中有这样的一段代码,是属于processToSupportEmoji中的:
...
int length = end - start +1;
char[] chs = TextUtils.obtain(length);
TextUtils.getChars(text, start, end, chs, 0);
for (int i = start ; i < end; i++) {
char c = chs[end-start];
if (c >= 0xD800 && c <= 0xDFFF && i + 1 < length) {
char[] tmp = TextUtils.obtain(2);
TextUtils.getChars(text, i, i+2, tmp, 0);
....
可以看出这段代码对数据越界的保护是错误的,很容易就crash,有兴趣可以看下这篇文章:Android程序自动退但是没有提示任何错误
发生这个crash的大部分都是2.3系统的手机,也有一部分是4.x,sony的仿宏一些机器也有,估计是复用了同一份代码。
备洞册So,问题的答案到这里就很明显了,将部分表情替换成点点的原因主要是这样的:
1. 大部分新表情都没有对应的unicode编码,而换了unicode编码,TextView/EditText直接显示在一些机器中就会遇到上面的crash
2. 考虑到安装包的大小,目前也没有把太多表情直接打包进去的打算(从目前版本的OSX中提取出来的表情大概有800多个,全部直接打包进去的话,会给安装包增加1~2M的体积)
BTW,Google在4.4之后也自行扩展了OpenType标准,同时也添加了一套自己的小黄人Emoji表情,可以直接在Google输入法中输入
展开全部
目前来说,安卓对微信emoji 的支持已经非常完善了,可以放心使用:
1、绘文字(日语:絵文字/えもじ emoji)是日本在无线通信中所使用卜和的视觉情感符号,绘意指图形,文字则是图形的隐喻,可用来代表多种表情,如笑脸表示笑、蛋糕表示食物等。
2、在NTT DoCoMo的i-mode系统电话系统中,绘文字的尺寸是12x12 像素,在传送时,一个图形有2个字节。Unicode编码为E63E到E757。而在Shift-JIS编码则是从F89F到F9FC。基本的绘文字共有176个符号,在C-HTML4.0的编程语言中,则另增添了76个情感符号。
3、最早由栗田穣崇(Shigetaka Kurit)创作,并在日本网络及手机用户中流行。
4、自苹果公司发布的iOS 5输入法中加入了emoji后,这种表情符号开始席卷全球,目前emoji已被大多数现代计算机系统所兼容的Unicode编码采纳,普遍应用于各种升带手机短信和社交网络吵弊芦中。
1、绘文字(日语:絵文字/えもじ emoji)是日本在无线通信中所使用卜和的视觉情感符号,绘意指图形,文字则是图形的隐喻,可用来代表多种表情,如笑脸表示笑、蛋糕表示食物等。
2、在NTT DoCoMo的i-mode系统电话系统中,绘文字的尺寸是12x12 像素,在传送时,一个图形有2个字节。Unicode编码为E63E到E757。而在Shift-JIS编码则是从F89F到F9FC。基本的绘文字共有176个符号,在C-HTML4.0的编程语言中,则另增添了76个情感符号。
3、最早由栗田穣崇(Shigetaka Kurit)创作,并在日本网络及手机用户中流行。
4、自苹果公司发布的iOS 5输入法中加入了emoji后,这种表情符号开始席卷全球,目前emoji已被大多数现代计算机系统所兼容的Unicode编码采纳,普遍应用于各种升带手机短信和社交网络吵弊芦中。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询