Emoji bug of Ciji

前几天,Dawncold 捉到一个词记的 bug:

是下暴雨的那天,输入的是下雨的 emoji 表情:☔️。

试了一下,在 TextField 编辑状态还是正常的,退出编辑状态后就成这样子了。另外,除了这个下雨的表情外,还有几个经典的 emoji 也显示成了黑白颜色的,但好在还是一个字符,没有出现后面的 VS16。基本可以锁定是字体的原因。

先查看了下雨的编码,在表情与符号里拷贝字符简介:

粘贴出来可以看到这个 emoji 编码是 U+2614 U+FE0F:

1
2
3
☔️
有雨
Unicode: U+2614 U+FE0F,UTF-8: E2 98 94 EF B8 8F

为了营造回忆的气氛,词记选用了花园明朝体,打开 ttf 文件后查看 U+2614 和 U+FE0F 位置的字符:

U+2614

U+FE0F

果然没错,就是字体里面覆盖了一部分的 emoji 表情导致的,还能找到其他一些 emoji 表情:
emojis

可能是花园明朝体在开始制作的时候,主流操作系统对 emoji 表情的支持还不到位,所以在字体文件里加入了一些 emoji 符号。当你输入这些表情时,因为字体里有这些符号,所以会显示字体里面的符号,而不会显示系统默认的彩色 emoji 字体。

但是,下雨表情里后面那个 VS16 是什么鬼?为什么这个下雨表情,由两个 Unicode 组成?

表示下雨的字符就是前面的 U+2614,而后面的 VS16 表示第 16 号字形变体(Variation Selector)。用 iOS 的表情键盘输入的下雨表情,默认就是第 16 号变体,在苹果的 emoji 字体里,就是一把蓝色的雨伞,上面五个雨滴。一个表情允许有多种不同的展示形式,比如苹果系统中有关人物的 emoji 表情都可以选择不同的肤色,就是采用了这种字形变体的方式。

于是这个 bug 就容易解决了,删掉所有的表情就好了,这样就会用系统的 emoji 字体进行显示。

另外,在浏览这个 ttf 文件时,发现了 Unicode 标准中很多有意思的符号,比如:

各种奇怪的性别:

还专门定义了各种单位:

音乐符号:

回收标记:

镰刀和锄头:

麻将牌:

扑克牌: