趁着做项目的机会了解了一下 emoji 编码的问题。在此文中总结一下emoji 资料。
P.S. 如果看不到文中的 emoji 渲染效果,请看文末的长图。
首先 unicode 标准定义了一个基本 emoji 符号集, 其中共 1182 个字符。例如 U+26A1 表示高电压 (⚡)。emoji 字符可能是以 text 风格呈现,或者以 emoji 风格呈现。具体两种风格呈现出来是什么样子往往与具体的平台有关,不过通常情况下,emoji 风格呈现的字符是彩色的,而 text 风格渲染的字符是黑白的。其中有部分 emoji 字符会默认使用 emoji 风格呈现,这部分 emoji 字符被称之为emoji_presentation。不过,我们可以通过修饰符(U+FE0F 与 U+FE0F)指定字符以 text 或 emoji 风格字符。例如, U+26A1 U+FE0F 则指定高电压符号号使用 emoji 风格渲染,而 U+26A1 U+FE0E 则指定高电压符号使用 text 风格渲染,其中 U+FE0F 与 U+FE0E 又分别被称之为 emoji 表示风格选择子与 text 表示风格选择子。具有这种变化的集合可参见这里。可以看出 emoji 除了基本字符集外,还可以通过某些控制字符组成新的 emoij 字符串展示为一个新的 emoji。这也主意味着,我们平时看到的一个 emoji 既可能是一个 unicode 字符,也可能是多个 unicode 字符组成。接下来,将依次介绍这些组合方式。
Emoji_presentation_sequence 即由基本 emoji 字符加上 U+FE0F 组合而成 emoji 序列串。例如 U+26A1 U+FE0F 。
Modfier_Base_Sequence 。这种是一种Modifier_Base + Modifer 修饰的方式。其中 Modifier 是用于对 Modifier_Base 进行修饰的 unicode 字符,目前定义了五种修饰字符,分别表示颜色的由深及浅,1F3FB到1F3FF (🏻..🏿) (ps, 如果看不见字符可以在手机上阅读)。那么显然,Modifier_Base 就是被能被修饰的 emoji 字符,显然不是所有的 emoji 字符都能被修饰,这里有可被修饰的 emoji 字符列表。例如,U+270D(✍️) 就是一个可以被修饰的 emoji 字符,那么它被 U+1F3FF 修饰后就会变成U+270D U+1F3FF(✍️🏿)。如果你在手机上,应该能看出不同之处了, 被修饰的 emoji 颜色变深了,PC 上该新 emoji 会被显示为两上方框。
Flag Sequence。这类 emoji 串是通过两个地域指示符(regional_indicator) 组合的方式来表示一个国家的国旗。总共有 26 个地域指示符,每个指示符又对应于一个英文字母含义,例如 U+1F1E8 为地域指示符 C, U+1F1F3 为地域指示符 N。这些指示符两两组合表示一个国旗,U+1F1E8 U+1F1F3 为中国国旗(🇨🇳)。并不是 26 x 26 种组合是全部合法的,合法的 Flag Sequence 只有 256 种。
KeyCap Sequence。这类 emoji 序列是将数字(0-9),* 与 # 通过一个 U+20E3 字符转换为键帽的样式。由于这种样式要求必须以 emoji 风格展示,所有会在序列中添加样式限制 U+FE0F。例如 U+0023 U+FE0F U+20E3 的 emoji 样式即是 #️⃣,U+0030 U+FE0F U+20E3 的 emoji 样式即是 0️⃣。其它与此类似。
ZWJ sequence。ZWJ emoji 序列即是通过 ZWJ 字符(U+200D, Zero Width Joiner)将基本 emoji 字符或Emoji_Modifier_Sequence连接起来,形成一个新的 emoji 表示样式。ZWJ 序列可参见这里。例如,U+1F468 U+200D U+1F469 U+200D U+1F467 (👨👩👧) 这个 emoji 表示家庭即由三个emoji字符,U+1F468(👨), U+1F469(👩), U+1F467(👧) 经 ZWJ 连接而成的。
Tag Sequence。Tag Sequence 由 tag_base tag_spec 与 tag_term 拼接而成的 emoji 序列串。其中 tag_base 可以是基本 emoji 字符,也可以是emoji_modifier_sequence 或者 emoji_presentation_sequence。 tag_spec 允许是从 U+E0020 到 U+E007E 的所有字符,而 tag_term 为U+E007F 作为结束符。目前只有三个合法 tag sequence,这种方式主要用于未来扩展使用。
方便看到 emoji 的效果,以下是文章截图: