转载请注明出处:http://www.cnblogs.com/shamoyuu/p/6694595.html

一、emoji是什么

绘文字(日语:絵文字/えもじ emoji)是日本在无线通信中所使用的视觉情感符号,绘意指图形,文字则是图形的隐喻,可用来代表多种表情,如笑脸表示笑、蛋糕表示食物等。
在NTTDoCoMo的i-mode系统电话系统中,绘文字的尺寸是12x12 像素,在传送时,一个图形有2个字节。Unicode编码为E63E到E757,而在Shift-JIS编码则是从F89F到F9FC。基本的绘文字共有176个符号,在C-HTML4.0的编程语言中,则另增添了76个情感符号。
最早由栗田穰崇(Shigetaka Kurita)创作,并在日本网络及手机用户中流行。
自苹果公司发布的iOS 5输入法中加入了emoji后,这种表情符号开始席卷全球,目前emoji已被大多数现代计算机系统所兼容的Unicode编码采纳,普遍应用于各种手机短信和社交网络中。

以上摘自百度百科

二、如何存储emoji

上面说到了,emoji表情并不是图片,而是拥有两个字节的图形(可以理解为字符),后台无法直接存储emoji字符,PC端在没有插件的情况下也无法显示emoji字符。可以通过encode对它进行编码后存储。前端进行解码以后可以直接使用。

三、emoji图标前端的显示

对于不需要截取的情况来讲,直接decode就可以用了。
但是对于需要截取,需要获取length的场景,emoji的大部分字符都是2个length,将造成非常大的麻烦。

我们先来看看进过encode编码后的emoji字符都是什么样的,点击展开,这里面列举了我手机上232个emoji字符

 %F0%9F%98%84
 %F0%9F%98%83
 %F0%9F%98%80
 %F0%9F%98%8A
 %F0%9F%98%89
 %F0%9F%98%8D
 %F0%9F%98%98
 %F0%9F%98%9A
 %F0%9F%98%97
 %F0%9F%98%99
 %F0%9F%98%9C
 %F0%9F%98%9D
 %F0%9F%98%9B
 %F0%9F%98%B3
 %F0%9F%98%81
 %F0%9F%98%94
 %F0%9F%98%8C
 %F0%9F%98%92
 %F0%9F%98%9E
 %F0%9F%98%A3
 %F0%9F%98%A2
 %F0%9F%98%82
 %F0%9F%98%AD
 %F0%9F%98%AA
 %F0%9F%98%A5
 %F0%9F%98%B0
 %F0%9F%98%85
 %F0%9F%98%93
 %F0%9F%98%A9
 %F0%9F%98%AB
 %F0%9F%98%A8
 %F0%9F%98%B1
 %F0%9F%98%A0
 %F0%9F%98%A1
 %F0%9F%98%A4
 %F0%9F%98%96
 %F0%9F%98%86
 %F0%9F%98%8B
 %F0%9F%98%B7
 %F0%9F%98%8E
 %F0%9F%98%B4
 %F0%9F%98%B5
 %F0%9F%98%B2
 %F0%9F%98%9F
 %F0%9F%98%A6
 %F0%9F%98%A7
 %F0%9F%98%88
 %F0%9F%91%BF
 %F0%9F%98%AE
 %F0%9F%98%AC
 %F0%9F%98%90
 %F0%9F%98%95
 %F0%9F%98%AF
 %F0%9F%98%B6
 %F0%9F%98%87
 %F0%9F%98%8F
 %F0%9F%98%91
 %F0%9F%A4%97
 %F0%9F%A4%94
 %F0%9F%99%84
 %F0%9F%A4%90
 %F0%9F%A4%93
 %F0%9F%99%83
 %F0%9F%A4%92
 %F0%9F%A4%95
 %F0%9F%A4%91
 %F0%9F%91%B2
 %F0%9F%91%B3
 %F0%9F%91%AE
 %F0%9F%91%B7
 %F0%9F%92%82
 %F0%9F%91%B6
 %F0%9F%91%A6
 %F0%9F%91%A7
 %F0%9F%91%A8
 %F0%9F%91%A9
 %F0%9F%91%B4
 %F0%9F%91%B5
 %F0%9F%91%B1
 %F0%9F%91%BC
 %F0%9F%91%B8
 %F0%9F%98%BA
 %F0%9F%98%B8
 %F0%9F%98%BB
 %F0%9F%98%BD
 %F0%9F%98%BC
 %F0%9F%99%80
 %F0%9F%98%BF
 %F0%9F%98%B9
 %F0%9F%98%BE
 %F0%9F%91%B9
 %F0%9F%91%BA
 %F0%9F%99%88
 %F0%9F%99%89
 %F0%9F%99%8A
 %F0%9F%92%80
 %F0%9F%91%BD
 %F0%9F%92%A9
 %F0%9F%94%A5
 %F0%9F%8C%9F
 %F0%9F%92%AB
 %F0%9F%92%A5
 %F0%9F%92%A2
 %F0%9F%92%A6
 %F0%9F%92%A7
 %F0%9F%92%A4
 %F0%9F%92%A8
 %F0%9F%91%82
 %F0%9F%91%80
 %F0%9F%91%83
 %F0%9F%91%85
 %F0%9F%91%84
 %F0%9F%91%8D
 %F0%9F%91%8E
 %F0%9F%91%8C
 %F0%9F%91%8A
 %F0%9F%91%8B
 %F0%9F%91%90
 %F0%9F%91%86
 %F0%9F%91%87
 %F0%9F%91%89
 %F0%9F%91%88
 %F0%9F%99%8C
 %F0%9F%99%8F
 %F0%9F%91%8F
 %F0%9F%92%AA
 %F0%9F%96%90
 %F0%9F%96%95
 %F0%9F%96%96
 %F0%9F%95%B5
 %F0%9F%9A%B6
 %F0%9F%8F%83
 %F0%9F%92%83
 %F0%9F%91%AB
 %F0%9F%91%AA
 %F0%9F%91%AC
 %F0%9F%91%AD
 %F0%9F%92%8F
 %F0%9F%92%91
 %F0%9F%91%AF
 %F0%9F%99%86
 %F0%9F%99%85
 %F0%9F%92%81
 %F0%9F%99%8B
 %F0%9F%92%86
 %F0%9F%92%87
 %F0%9F%92%85
 %F0%9F%91%B0
 %F0%9F%99%8E
 %F0%9F%99%8D
 %F0%9F%99%87
 %F0%9F%8E%A9
 %F0%9F%91%91
 %F0%9F%91%92
 %F0%9F%91%9F
 %F0%9F%91%9E
 %F0%9F%91%A1
 %F0%9F%91%A0
 %F0%9F%91%A2
 %F0%9F%91%95
 %F0%9F%91%94
 %F0%9F%91%9A
 %F0%9F%91%97
 %F0%9F%8E%BD
 %F0%9F%91%96
 %F0%9F%91%98
 %F0%9F%91%99
 %F0%9F%92%BC
 %F0%9F%91%9C
 %F0%9F%91%9D
 %F0%9F%91%9B
 %F0%9F%91%93
 %F0%9F%8E%80
 %F0%9F%8C%82
 %F0%9F%92%84
 %F0%9F%92%9B
 %F0%9F%92%99
 %F0%9F%92%9C
 %F0%9F%92%9A
 %F0%9F%92%94
 %F0%9F%92%97
 %F0%9F%92%93
 %F0%9F%92%95
 %F0%9F%92%96
 %F0%9F%92%9E
 %F0%9F%92%98
 %F0%9F%92%8C
 %F0%9F%92%8B
 %F0%9F%92%8D
 %F0%9F%92%8E
 %F0%9F%91%A4
 %F0%9F%91%A5
 %F0%9F%92%AC
 %F0%9F%91%A3
 %F0%9F%92%AD
 %F0%9F%A4%98
 %F0%9F%93%BF
 %F0%9F%A4%96
 %F0%9F%A6%81
 %F0%9F%A6%84
 %F0%9F%A6%83
 %F0%9F%A6%80
 %F0%9F%A6%82
 %F0%9F%A7%80
 %F0%9F%8C%AD
 %F0%9F%8C%AE
 %F0%9F%8C%AF
 %F0%9F%8D%BF
 %F0%9F%8F%BA
 %F0%9F%9B%90
 %F0%9F%95%8B
 %F0%9F%95%8C
 %F0%9F%95%8D
 %F0%9F%8F%90
 %F0%9F%8F%B9
 %F0%9F%8F%B8
 %F0%9F%8F%93
 %F0%9F%8F%92
 %F0%9F%8F%91
 %F0%9F%8F%8F
 %F0%9F%95%8E
 %F0%9F%8D%BE
 %F0%9F%8F%8B
 %E2%9C%8D
 %E2%98%9D
 %E2%9C%8A
 %E2%9C%8C
 %E2%9C%A8
 %E2%98%BA
 %E2%9C%8B
 %E2%9D%A4
 %E2%9B%B9

 下面的几个是中文
 %E4%BD%A0
 %E4%BB%A5
 %E4%B8%BA
 %E6%88%91
 %E8%B4%AB
 %E7%A9%B7
 %EF%BC%8C
 %E7%9B%B8
 %E8%B2%8C
 %E5%B9%B3
 %E5%B0%B1
 %E6%B2%A1
 %E6%9C%89
 %E6%84%9F
 %E6%83%85
 %E5%90%97
 %EF%BC%9F
 %E4%BD%A0
 %E6%98%AF
 %E4%B8%8D
 %E6%98%AF
 %E6%83%B3
 %E9%94%99
 %E4%BA%86

可以看到emoji表情的编码拥有比较高的规律性,要么是%F0%9F开头的12位,要么是%E2%9开头的9位。所以可以从这方面入手处理截取,方案有二,各有利弊。
一、按上面的规律截取字符串
优点是即使这里没有列举的emoji表情也能够进行判断,但是有误伤的可能
二、将上面所有的emoji编码存起来,对符合上面规律的字符串再进行一次逐一的对比
优点是不可能误伤,但是如果对于没有列举到的表情将无能为力

下面的代码是采用第一种做法获取到解码后的字符数组,这样length等都可以正常使用,想怎么截取都可以。

 ///将带有emoji表情的encode编码的字符串转换成字符数组
 function getEmojiStrArray(str){
   if(!str || str.constructor.name != "String"){
     return [];
   }
   var result = [];

   //微信名不能有 <>/ 这三个字符,不是微信的其他情况这里需要再处理一下
   var psw = "<";
   var reg = /%F0%9F\S{6}?|%E2%9\S{4}?/gi;
   //所有emoji图标
   var emojis = str.match(reg) || [];
   //把emoji的编码都解码了
   for(var index in emojis){
     emojis[index] = decodeURI(emojis[index]);
   }
   //把不包含emoji的编码都解码了
   str = decodeURI(str.replace(reg, psw));

   result = str.split("");

   var index = 0;
   for (var i = 0; i < result.length; i++) {
     if(result[i] === psw){
       result[i] = emojis[index];
       index++;
     }
   }

   return result;
 }

移动端emoji图标的存储和显示的更多相关文章

  1. MySQL 支持 emoji 图标存储

    在MySLQ中 UPDATA 和 INSERT 数据的时候,如果数据上面带有emoji图标,例如:?.?.? 很容易更新或者插入不成功,导致报错. 1 2 Error: ER_TRUNCATED_WR ...

  2. 移动端字体图标不显示的Bug

    用16进制编码的字体图标在部分小米机型显示不正常. 测试机型:小米1,小米1s,小米2浏览器:微信6.1内置浏览器,QQ浏览器 5.7 X5内核字体图标:不显示svg图标:显示正常 以下来自额微信内置 ...

  3. 教你如何让数据库支持emoji表情符存储

    From: http://www.cnblogs.com/janehoo/archive/2016/04/06/5359800.html 一.教你如何让数据库支持emoji表情符存储 解决方式:更换字 ...

  4. mysql支持emoji表情符存储

    一.教你如何让数据库支持emoji表情符存储 解决方式: 更换字符集utf8-->utf8mb4 问题描述: 前台应用抓取微博信息,每天总有几条数据插入不成功.应用日志显示: java.sql. ...

  5. MySQL中支持emoji表情的存储

    由于需要实现emoji表情评论的功能,所以数据库需要支持emoji表情的存储,根据查询的资料最终实现了该功能,现将实现的过程以及过程遇到的一些问题记录下来,供大家参考和交流. mysql的utf8编码 ...

  6. 微信自定义菜单的emoji图标

    微信公众号自定义菜单添加emoji表情图标 第一步:打开微信公众平台接口调试工具,点击前往接口调试工具: 第二步:把这段代码  {"button":[{"sub_butt ...

  7. Mysql中文存储、显示及不区分大小写控制

    刚开始使用mysql,以为安装了完了就可以使用了,结果是我太天真了.mysql5.7版本,默认严格区分大小写,并且不支持中文存储. 严格区分大小写,即A表和a表示两个不同的表 实例 修改 在/etc/ ...

  8. 特殊字符,如Emoji表情Base64存储到数据库

    有些特殊字符,如Emoji,存储到oracle数据库就会变成乱码,解决方案就是Base64转码后存储到数据库,取出后再解码传输,经过验证是可以的. 编码存储,接收参数转json再.ToString() ...

  9. easyui-tabs图标(获取焦点时显示图标,失去焦点时隐藏图标)

    获取焦点时显示图标,失去焦点时隐藏图标 <script type="text/javascript"> $('#_progress').tabs({ onSelect: ...

随机推荐

  1. 第十二篇 C# 将HTML 直接转成Excel

    前些天写项目的时候,客户要求用HTML表格把信息展示出来,后面还要用展示的内容要导出Excel.本来想想在后台操作的话估计是要做死了,但是经过细想,Excel能够发布成HTML,一定也可以由HTML转 ...

  2. 网络传入安全jwts

    使用json web token 发表于Aug 13 2014 由来 做了这么长时间的web开发,从JAVA EE中的jsf,spring,hibernate框架,到spring web MVC,到用 ...

  3. express 4

    http://www.expressjs.com.cn/4x/api.html#app中间件 路由 模板 跨域 json cookie session

  4. Solr vs. Elasticsearch谁是开源搜索引擎王者

    当前是云计算和数据快速增长的时代,今天的应用程序正以PB级和ZB级的速度生产数据,但人们依然在不停的追求更高更快的性能需求.随着数据的堆积,如何快速有效的搜索这些数据,成为对后端服务的挑战.本文,我们 ...

  5. 1601: [Usaco2008 Oct]灌水

    1601: [Usaco2008 Oct]灌水 Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 1342  Solved: 881 [Submit][S ...

  6. 雪花降落CADisplayLink

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px "PingFang SC"; color: #1d9421 } p.p2 ...

  7. 温故而知新——map

    map  :关联式容器,使用时是以属性值对的方式进行使用,例如:<key,value>.map key值唯一,相同的key值插入时只会保留一个.除此之外,map的特点还包括:1.map底层 ...

  8. 分享小知识:善用Group By排序

    以下列举了公用表/临时表/聚合函数三个因素为例子(覆盖索引因素除外,有利用此类索引都会以索引顺序)  环境: Microsoft SQL Server 2014 (SP1-GDR) (KB319472 ...

  9. DapperPoco -- 基于Dapper的、轻量级的、高性能的、简单的、灵活的ORM框架

    为什么要重复造轮子 因为现有的轮子都在某些方面不太令我满意,下面我来一一点评一下,欢迎拍砖. Entity Framework 我喜欢傻瓜化使用方式的框架,同时又不失灵活性. EF虽然使用起来足够简单 ...

  10. HTTP请求错误400、401、402、403、404、405、406、407、412、414、500、501、502解析

    HTTP 错误 400 400 请求出错 由于语法格式有误,服务器无法理解此请求.不作修改,客户程序就无法重复此请求. HTTP 错误 401 401.1 未授权:登录失败 此错误表明传输给服务器的证 ...