Android 微信对 emoji 的支持是不是很差?为何这样设计

新手学堂012

  Emoji从最早开始到现在,比较通用的是两种编码方案,分别是Softbank和Unicode,android版微信早期也是使用Softbank编码,然后客户端根据表情对应的Softbank编码使用SpannableString在TextView, EditText中显示成对应的表情,此时Emoji表情的集合还不是很多,微信只打包进去了大概400多个左右,在早期可以满足大部分Emoji表情的显示需求

  但是,随着Unicode 60以及Unicode 70的发布,越来越Emoji表情被加入到这个标准当中,iOS系统自行扩展OpenType标准,通过Apple Color Emojittf这个字体来讲Emoji表情直接显示出来(OSX下也有这个字体,在/System/Library/Fonts/Apple Color Emojittf),当时国外也有对这个问题进行过讨论:Color bitmapfonts thanks to Apple! ,但是,由于新加进来的表情都没有对应的Softbank编码,无法转码成Softbank,并且客户端在打包的时候只放进了400多个Emoji表情,所以在显示的时候,只能转换成""来显示

  后来,随着越来越多表情不能显示,我们这边曾经尝试过直接在客户端使用unicode编码,并尝试过一次对外的灰度,在灰度的过程中,我们发现了一些crash,占的总量还不低,crash的堆栈大概是这样的:

  at androidtextSpannableStringInternalgetChars(SpannableStringInternaljava:102)

  at androidtextTextUtilsgetChars(TextUtilsjava:105)

  at androidtextLayoutprocessToSupportEmoji(Layoutjava:3747)

  at androidtextLayoutsupportTabandEmoji(Layoutjava:3783)

  at androidtextLayoutmeasureText2(Layoutjava:3141)

  我们注意到了 processToSupportEmoji 这个方法,明显不是属于Android系统原有的方法,应该是某些rom自行更改出现的问题,google一下,果不其然,在某些MTK的rom中有这样的一段代码,是属于processToSupportEmoji中的:

  

  int length = end - start +1;

  char[] chs = TextUtilsobtain(length);

  TextUtilsgetChars(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 = TextUtilsobtain(2);

  TextUtilsgetChars(text, i, i+2, tmp, 0);

  

  可以看出这段代码对数据越界的保护是错误的,很容易就crash,有兴趣可以看下这篇文章:Android程序自动退但是没有提示任何错误

  发生这个crash的大部分都是23系统的手机,也有一部分是4x,sony的一些机器也有,估计是复用了同一份代码。

  So,问题的答案到这里就很明显了,将部分表情替换成点点的原因主要是这样的:

  1 大部分新表情都没有对应的unicode编码,而换了unicode编码,TextView/EditText直接显示在一些机器中就会遇到上面的crash

  2 考虑到安装包的大小,目前也没有把太多表情直接打包进去的打算(从目前版本的OSX中提取出来的表情大概有800多个,全部直接打包进去的话,会给安装包增加1~2M的体积)

  BTW,Google在44之后也自行扩展了OpenType标准,同时也添加了一套自己的小黄人Emoji表情,可以直接在Google输入法中输入

微信星巴克员工星福利在微信内找。

1、打开微信扫小程序码,或者通过微信搜一搜星巴克。

2、进入星巴克官方小程序,小程序支持通过手机号一键注册星巴克星享俱乐部会员,并享受会员权益。

3、首次通过小程序注册星巴克新会员,还能获得三重入会礼包,星悦5元代金券、专星送免配送费券、微信支付消费满60元减8元代金券。

微信平台发送的图文消息一般带有的标题表情,大多都是emoji标题表情,这些表情可以通过第三方的一些软件来进行使用,在打开微信公众号图文编辑后台的时候,可以打开小蚂蚁编辑器,在首页左侧有一个符号表情,打开后直接点击后面的复制然后粘贴到微信公众号的图文标题里面就可以了,因为有些表情符号电脑不支持,所以粘贴过去可能不显示,但是预览到手机上是正常的

星享卡更好。

购卡花的88元不是以余额的方式存在卡里的,也就是说这88块钱不能用来买饮料。买完卡以后你的钱就变成了卡里的5张券,通过这5张券能够优惠购买饮料,比如买一送一。你只要买的饮料价格高于30块钱,那3张买一送一就优惠了90块钱,也就是回本了。

这张卡拿到手首先想到的就是:短时决策容易陷入诱惑。在听到98元能买5张优惠券的介绍下,消费者来不及仔细计算优惠券内容,仅仅会对数字做简单的关联(例如,98元=5张优惠券),这种仅做简单关联就做出短时决策的决策系统很容易被误导,从而陷入消费陷阱。

消费者会随着时间推移,对付出的金钱变得越来越不敏感。付出的98块钱的感觉,随着时间推移,会越来越不敏感。也就意味着,当消费者使用优惠券购买饮品时,这个购买的时间点离当初买星礼包的时间隔得越久,消费者越会觉得得到了优惠,以为自己真的只花了17块钱买到了一杯原价34的饮料,却忘记自己早在买卡时就已经为这杯饮料预付过一部分钱了。

微信导入eif表情的三种办法:

方法一:

第一步:直接点击“导入”。

第二步:选择需要添加的表情。

第三步:单击“打开”,除了支持批量导入,还支持直接导入zip、eip、eif等格式的表情包。

第四步:导入完成后,会自动新建一个表情分组,分组名称可以自行修改。

方法二:

先新建一个表情分组,进入该分组后再进行“导入”。这种方式能够将表情导入到指定分组下。

方法三:

另外,在表情商店里,同步助手还准备了海量的系列表情,只需一点,即可自动导入到微信中。

提示:为了能够成功导入表情,导入前先从后台关闭微信,导入完成后再重新打开即可看到新导入的系列表情。

具体方法步骤如下

在百度上搜索emoji代码大全,直接查看每一个emoji表情对应在WeChat中的小符号即可。

比如第一个的小太阳,直接用Ctrl+C复制到微信图文的标题即可,有的浏览器不支持可能会出现一个框,此时只要预览微信图文到手机上就可以看见这个emoji表情啦。这个方法其实非常简单,只要找对了emoji的代码列表就可以了。

另一个方法是登陆i排版(iPaiban),在样式中选择“小符号”,可以看见微互动标红的区域,这些小符号很多在微信上的呈现方式是emoji形式的。

所以,如果没有emoji表情代码对照表,可以在i排版上找到同样的小符号进行呈现。

星巴克星礼卡好。

星巴克是全球最大的咖啡连锁店,其总部坐落美国华盛顿州西雅图市。星巴克旗下零售产品包括30多款全球顶级的咖啡豆、手工制作的浓缩咖啡和多款咖啡冷热饮料、新鲜美味的各式糕点食品以及丰富多样的咖啡机、咖啡杯等商品。星巴克在全球范围内已经有近21300间分店遍布北美、南美洲、欧洲、中东及太平洋区。

星巴克星礼卡是表达对家人、朋友、顾客和同事的感谢的极好的方式。将星礼卡绑定至星享俱乐部帐户,使用星巴克App移动支付,即可加速积星,每消费40元获得一颗星星。

星礼卡使用方式

1、就实体星礼卡而言,持卡人可以通过星巴克官网或星巴克应用登录星享俱乐部帐户后,在相关页面输入实体星礼卡的卡号和密码以将其绑定至持卡人所登录的星享俱乐部帐户。在进行绑定前,请确保实体星礼卡已激活。

2、就星巴克用星说社交礼品平台上出售的电子星礼卡而言,持卡人可以通过相关页面登录星享俱乐部帐户后,将该电子星礼卡绑定至持卡人所登录的星享俱乐部帐户。

3、持卡人可在每个星享俱乐部帐户中同时绑定多张星礼卡,但最高不超过15张。

4、在星礼卡被绑定至星享俱乐部帐户后,为了保护星礼卡卡内资金的安全,持卡人应在星巴克应用中设置并开启口令密码锁。

目前得出的答案是数据库没有添加 Emoji 支持, 导致从微信那边获取过来的带有 Emoji 表情的昵称出现乱码, 有两种解决方式:

1是给数据库添加 Emoji 支持, 在 SO 上有解决的方法

2在用户进行注册时把获取过来的乱码过滤掉, 只留下正常的字符, 过滤我使用了下面的方法, 代码比较简陋, 但可以正常使用: