emoji
表情是一种视觉上的速记符号,最初是在1999
年由一个名叫栗田穣崇(Shigetaka Kurita
)的日本人发明的。
emoji
一词来源于日本语里的絵(e=图片)文(mo=写)字(ji=字符)。 栗田穣崇(Shigetaka Kurita
)创造了这些符号,是为了能在消息对话中,相较于传统的纯文字或者简单的表情,提供出更丰富的感情色彩,让对话不至于被曲解。
2010
年,Unicode
开始筛选常用的emoji
表情,加入到Unicode
字符集中, 并给每个emoji
表情分配一个Code Point
。
Unicode
标准规定emoji
字符的Code Point
范围为U+1F601 ~ U+1F64F
。
版本 | 发布时间 |
---|---|
Emoji 1.0 | 2015/08 |
Emoji 2.0 | 2015/11 |
Emoji 3.0 | 2016/06 |
Emoji 4.0 | 2016/11 |
Emoji 5.0 | 2017/03 |
截止2017年4月,Unicode
字符集中emoji
字符共有2389
个。
Unicode
只是规定了emoji
的Code Point
和含义,并没有规定它的样式。 比如:Code Point
为U+1F600
的emoji
字符表示一张微笑的脸,但是这张脸长什么样,则由各个厂商自己实现。 因此,当我们输入一个emoji
表情的时候,并不能保证所有用户看到的都是同一张脸。如果用户的系统没有实现这个emoji
字符, 用户就会看到一个没有内容的方框,因为系统无法渲染这个字符。
目前,Android系统、iOS系统、GitHub、Twitter
、Facebook
等都有自己的emoji
实现。
除了使用单个Code Point
表示一个emoji
字符外, 还允许多个Code Point
组合在一起表示一个emoji
字符。 如果组合呢?其中的一种方式是"零宽度连接符"(ZERO WIDTH JOINER,缩写 ZWJ)U+200D
。
举例来说,下面是三个emoji
的Code Point
:
U+1F468:男人
U+1F469:女人
U+1F467:女孩
上面三个Code Point
使用U+200D
连接起来,U+1F468 U+200D U+1F469 U+200D U+1F467
, 就会显示为一个emoji
表情:👨👩👧,表示他们组成的家庭。如果用户的系统不支持这种方法,就还是显示为三个独立的emoji
表情: 👨👩👧
由于Unicode
标准规定emoji
字符的Code Point
范围为U+1F601 ~ U+1F64F
, 它已经不在BMP
范围内了。而我们平常使用的字符编码多以UTF-8
为主,而UTF-8
编码只实现了BMP
, 也即是UTF-8
编码支持的Code Point
为U+0000 ~ U+FFFF
。
一般来说,MySQL
数据库的默认字符集都会配置成UTF-8
,所以,如果要存储包含emoji
的字符会报错。 为了解决这个问题,MySQL
从5.6
版本开始支持4
个字节的UTF-8
编码方案, 以应对目前这种3
个字节的UTF-8
编码不能满足的情形。这4
个字节的UTF-8
编码方案被称为utf8mb4
。