2015年12月28日 14:24:51 星期一

首先注意的地方:

1. emoji是需要操作系统支持的, 例如: ios更新时, 会在升级日志里说明, 增加了对多少个emoji图标的支持. 原理上是os维护一张表, 当遇到这些unicode十六进制串的时候, 去表里找对应的图片来渲染

2. 同样的"笑脸"表情, 在不同的系统下的图形是不一样的, 有Unicode官方(原生)的, web端有一套(黑白的), Android, ios, 还有一些开源的, 但是, 同一个意思的表情的Unicode编码是一样

图注: Unicode官方列表

从图中看出:

同一编码(或表达同一个意思的表情)在各个平台的渲染图形是不一样的

code列是unicode编码标准, brow.是浏览器的渲染形状, apple是ios的渲染形状, 还有Google的, One是一个开源的方案, 后边还有twitter, Gmail....

有些表格里是missing, 说明这个平台对这种表情还不支持

mysql存储:

注意:

1. utf8mb4, 是最大支持四个字节的utf8字符集, 是utf8的超集, 所以升级utf8到utf8mb4不会对原有字段截断, 没有影响

2. utf8mb4中的mb跟PHP的mb_**函数们是一个意思, multi Byte 多字节的意思

3. 存储或查询的时候, 表以及相应字段修改为utf8mb4, 不用修改mysql配置文件(备份的时候要指定字符集,mysqldump --default-charater-set=utf8mb4)

mysql> show create table emoji \G
*************************** 1. row ***************************
Table: emoji
Create Table: CREATE TABLE `emoji` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`content` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4
mysql> show full columns from emoji;
+---------+------------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
| Field | Type | Collation | Null | Key | Default | Extra | Privileges | Comment |
+---------+------------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
| id | int(10) unsigned | NULL | NO | PRI | NULL | auto_increment | select,insert,update,references | |
| content | varchar(50) | utf8mb4_general_ci | YES | | NULL | | select,insert,update,references | |
+---------+------------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+

图注: 表字符集的配置(charset utf8mb4, collate utf8mb4_general_ci)

4. 连接数据库查询前设置连接字符集 set names utf8mb4 (下边通过对一个Android小程序的调试来解释)

5. 直接在命令行查看数据, 表情符号会是一个问号(?), 但实际上在安卓中可以正常显示的, 因为我这个linux不支持, 而Android系统支持,

(mysql select 出来有4个问号说明插入错误, 注意insert时set names utf8mb4, select 出来有一个问号, 说明select时没有set names utf8mb4)

下边是几个平台的截图:

=>=>

当然浏览器显示的表情比较简陋, 可以通过一些工具对其进行"美化", 比如 js-emoji, php-emoji

美化的原理是

1. 事先制作一张包含所有emoji表情的图片

2. 然后将编码与图片偏移量的对应关系写到数组里边

3. 最后将输入的字符串中包含的emoji编码替换成对应的图片或<img>标签

因为在成为标准之前, emoji有好多版本在流行, 这些工具也支持不同版本的编码进行转换,其原理就是生成每个版本之间的对应关系, 如下图

emoji表情初探的更多相关文章

  1. 移动前端手机输入法自带emoji表情字符处理

    今天,测试给我提了一个BUG,说移动端输入emoji表情无法提交.很早以前就有思考过,手机输入法里自带的emoji表情,应该是某些特殊字符.既然是字符,那应该都能提交才对,可是为啥会被卡住呢?搜了一下 ...

  2. JS操作Unicode编码的emoji表情显示在页面

    前言:项目中用到了emoji表情,后端传递数据时直接是以Unicode形式,在页面总是无法展示,找尽各种方法总算是试出了一种,虽然达到效果但是并不是特别理解其中的原理并且无比笨拙,贴在这用作笔记,如果 ...

  3. IOS Emoji表情

    IOS Emoji 前言:我比较喜欢有趣的东西,有一些有趣的小东西,可能不是多么多么牛逼,也可能不需要多高深的技巧,也不会为其他什么强大的功能而服务,但是有时候将很多有趣的小东西组合起来运用,比如在你 ...

  4. 有关emoji表情以及utf-16编码

        昨日IOS组的同事遇到一个棘手的问题:当输入框内含有emoji表情时,如何获取文本框内的字符数(一个emoji表情算一个字符).       先从我最近接触的JAVA说起,JAVA中,在使用S ...

  5. iOS emoji表情转码 或者判断

    如果项目中有评论或者信息恢复的地方,往往会用到emoji,有时候如后台不支持emoji,就会显示乱码错误,我们可以把emoji转成unicode编码或者utf8编码格式传给服务器.当然如果后台服务器接 ...

  6. mysql支持IOS的Emoji表情

    原因: UTF-8编码有可能是两个.三个.四个字节.Emoji表情是4个字节,而Mysql的utf8编码最多3个字节,所以数据插不进去. 解决办法: 将Mysql的编码从utf8转换成utf8mb4 ...

  7. iOS 获取emoji表情和拦截emoji表情

      1 2 //将数字转为 #define EMOJI_CODE_TO_SYMBOL(x) ((((0x808080F0 | (x & 0x3F000) >> 4) | (x &a ...

  8. 让mysql支持emoji表情

    一.问题及原因 APP产品想对Emoji进行支持,但发现mysql数据库无法写入表情.原因是我们的mysql数据库默认用的是utf8编码,utf8编码存储时用的是三个字节,但Emoji表情是4个字节, ...

  9. 数据库支持emoji表情

    从MySQL5.5.3开始,MySQL 支持一种utf8mb4的字符集,这个字符集能够支持4字节的UTF8编码的字符.utf8mb4字符集能够完美地兼容utf8字符串.在数据存储方面,当一个普通中文字 ...

随机推荐

  1. QT读写ini配置文件

        /********下面是写ini文件*************************/     //Qt中使用QSettings类读写ini文件     //QSettings构造函数的第一 ...

  2. Sphinx中文分词安装配置及API调用

    这几天项目中需要重新做一个关于商品的全文搜索功能,于是想到了用Sphinx,因为需要中文分词,所以选择了Sphinx for chinese,当然你也可以选择coreseek,建议这两个中选择一个,暂 ...

  3. inet_ntoa、 inet_aton、inet_addr

    inet_addr()   简述:将一个点间隔地址转换成一个in_addr. #include <winsock.h> unsigned long PASCAL FAR inet_addr ...

  4. 使用自己的ClassLoader实现热替换

    首先实现一个自己的ClassLoader,该ClassLoader重写findClass方法. 从classpath中加载类资源. 注意,不要重写loadClass方法.  因为在使用自定义的MyCl ...

  5. CF469D Two Set (并查集)

    Codeforces Round #268 (Div. 2)D Codeforces Round #268 (Div. 1)B CF468B D. Two Sets time limit per te ...

  6. EDW on Hadoop(Hadoop上的数据仓库)技术选型和实践思考

    在这篇文章中, 将讨论EDW on Hadoop 有哪些备选方案, 以及我个人的倾向性, 最后是建构方法.  欢迎转载, 但必须注明原贴(刘忠武,  http://www.cnblogs.com/ha ...

  7. [译]git status

    git status git status命令能展示工作目录和stage区的状态. 使用他你能看到那些修改被staged到了, 哪些没有, 哪些文件没有被Git tracked到. git statu ...

  8. pyspider安装

    官方文档上说的比较简单: pip install pyspider 但是实际安装时还是有些问题导致无法成功. windows下安装 先安装PhantomJS 可以依照自己的开发平台选择不同的包进行下载 ...

  9. HDU 1048

    #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> int main() { char ...

  10. import()函数