自制彩色字体Zsye发布・绘文字的隐藏技
“Zsye”是一个 ISO 15924 四字代码,指符号(symbol)的彩色(绘文字,emoji)变体。
www.unicode.org/iso15924/iso15924-codes.html

动机
绘文字,虽然看起来像图片,但也是文字,它有可以被机器识别的语义,可以在一些不能发图的地方传播、节省流量,可以被ctrl+F搜索,这是表情图所不能代替的。
这个完全原创的字体不算新,去年6月之前就在用,用了快一年了。制作动机是,在用的视窗系统比较古老、彩色字体不好看,迫切需要显示某些b站常见彩色绘文字,
比如:

及一些感慨:

和一些美好的祝❤️愿:

不光b站,像桃饱网还老喜欢用👉👈这对符号:

还要区分b站一个心形表情图(有必要吗?图片不便传播,连b站专栏都不能插入文中使用。如果是也嫌系统绘文字字体不好看,就学推特自定义啊,技术上又不难)

最后还有一个技术问题。统一码规定某些字符形状完全一致🔴🔵🟠🟡🟢🟣🟤⚪⚫,只有颜色区别🟥🟦🟧🟨🟩🟪🟫⬜⬛,某些场合我需要区分它们。
加之系统字体老旧不能显示所有彩色心,💙因💚此💛做🧡了❤这💜个🤎字🖤体🤍

设计
统一码有些历史上的妥协。比如这个❤️,你看见是红色的,但其实它是:
U+2764 HEAVY BLACK HEART “粗黑心”
名称其实没错,本来❤在各种非彩色字体里都是黑心。但到了彩色字体时期,统一码需要找补,于是:
[先于绘文字收录的符号名称之White/Black一般译作 空心/实心 而非 白/黑](unicode.org/reports/tr51/#Names)
并启用了变体选择符(U+FE00~FE0F Variation Selectors,简称VS,不可见字符,设计上是故意显示不出来的,原则上即便有字形也不会显示)其中,
VS15 U+FE0E指定前一个符号表现为单色(text style,使用例:❤︎)
VS16 U+FE0F指定前一个符号表现为彩色(emoji style,使用例:❤️)
注意这只是指定,如果渲染的软件\应用不理会、字体不支持也没办法。“Zsye”就不支持VS15,不过我全都指定了后备单色字形,在不支持彩色字体的软件里会显示为对应的区分用单色字形,可以用🟥🟦🟧🟨🟩🟪🟫⬜⬛试一试。
这种名实不符的情况还有。除了⭐️中号空心星,为了区分下列这些,我也单独做了彩字:

✖️ 看起来是个叉,其实是 U+2716 HEAVY MULTIPLICATION X “粗X形乘号”,和➕️加➖️减➗️除 一样不做成红色,经常被误用。
❌️ U+274C CROSS MARK “叉号”,一般做成大红叉。对应的是✔️ U+2714 HEAVY CHECK MARK “粗勾选标记”。
❎️负形×标记,绘文字中用途是当作点叉按钮,可以与✅️负形✓标记一个颜色。
但这个☑️ 就挺怪,好像与✅️重复,其实与 ☐☑︎☒ (用了VS15)是同一批的选项框,另外2个☐☒不是绘文字。
由于某些人会在评论区打扑克,我需要区分究竟是实心的心❤还是红桃♥。



绘文字似乎不重视麻将,并没有全套的麻将绘文字,仅一个🀄是规定为彩色的(微软大善人把全套做成彩色是个例外)。虽然没必要,我顺带把🀆白板 和🀫牌背 给做了。

由于我想让该字体完全原创,所以没用现成Noto字体,找了张不错的实物图作参考搞了个“黑体楷书(?)”。

同理,交通标志停车让行🛑则是不用思源黑体,直接拍了张照片参考。

还有波浪线 〰〰〰 等的制作就不介绍了吧☘️

FLAG
为了让绘文字便于使用,有些复杂的处理被隐藏起来,但既然您看到这里大概也明白:某些看上去是1个的绘文字,实际上由不止1个字符组成:这个💙(U+1F499)是1个字符,但这个❤️(U+2764 U+FE0F)是2个字符,而这个👁️🗨️(U+1F441 U+FE0F U+200D U+1F5E8 U+FE0F)是5个字符(👁️彩色+[ZWJ]+🗨️彩色)。
隐藏技就是:统一码里没有一面国旗被编码,大多国家、属地、具特殊科学价值地点、组织旗帜是由区域指示符序列(Regional Indicator Sequences,简称RI)组成,是26个像🇷、🇸、🇺……这样的字符。而RI遵循 ISO 3166-1二位字母代码,比如俄罗斯的二位字母代码就是RU,那么把🇷、🇺贴在一起,就成了🇷🇺 ——你在选中的时候会发现这2个字符紧贴在一起没法分开成🇷 🇺,这就是有意向用户隐藏起来的程序处理,防止用户困惑:怎么旗子点一下删除就变成一个英文绘文字了……
而呈现为旗帜就是字体解决的事。字体在收到有效的RI后会找到相应的旗帜字形给软件显示,如果没有相应旗帜,那就显示为类似下图这样:

许多国家没撑到 ISO 3166-1 确立的时候(初次发表于1974年)就灭亡了,但苏联(Soviet Union)恰好有二位字母代码:SU 因历史原因被保留不会被用作别的用途——直到目前还有.su 域名,所以🇸🇺技术上允许呈现为苏联国旗。
SU 原本自1992年9月起做为过渡性保留代码,自2008年6月改起为特殊保留代码
实际上此前已存在支持苏联国旗的彩色字体 [BabelStone Flags](babelstone.co.uk/Fonts/Flags.html),不过打开发现字形曲线似乎是自动扫描的,比较渣,所以我重新绘制了。
这个二位代码是否可以自己编?倒也有先例:
代码 XE、XS、XW 被WhatsApp软件分别用于表示英格兰、苏格兰、威尔士国旗的表情图标。
但前提是,使用者自定义代码:当使用者采用ISO 3166-1代码系统时,在其内部添加用于进一步表示其它国家、地区或地理区域名称的代码,ISO 3166/MA将不会在标准的更新过程中使用这些代码。下面的二位代码可以由使用者自由分配:AA、QM到QZ、XA到XZ、以及ZZ。
这意味着跟私用区一样可能撞车。
于是暂时从未分配代码里挑出2个:🇱🇶(LQ,Liuqiu)、🇷🇰(RK,Ryukyu)冒充琉球国代码。
参考:ja.wikipedia.org/wiki/琉球王国、Flag_of_Ryukyu.svg

我将字形做成符合其实际纵横比例的平放样式,无旗杆,不勾边(白底旗看不到边是正常情况)
如果你的软件不支持RI,那么请从私用区复制:U+E001、U+E002。含后备单色字形。
还有一个 Flag Emoji Tag Sequences (使用U+1F3F4🏴 和 不可见的标签符) 是对应ISO 3166-2代码的,如统一码规定的英格兰旗🏴,本文篇幅过长不提。

该彩色字体为矢量的CPAL制式,Win10和新浏览器应该都支持。可在这下载与在线预览:
[MY1L/wwwoff](github.com/MY1L/wwwoff/releases)

端午节修订:在github写了个干扰其他绘文字字体显示旗帜的解决方案。