【发布时间】:2020-08-15 17:25:03
【问题描述】:
创建表情符号字体时,ZERO WIDTH JOINER 的任何序列是否有效?
例如:我可以使用????★???? (Waving White Flag + zwj + Black Star + zwj + Green Square) 来表示上面带有绿星的白旗吗?然后渲染它,比如说Esperanto flag?
【问题讨论】:
创建表情符号字体时,ZERO WIDTH JOINER 的任何序列是否有效?
例如:我可以使用????★???? (Waving White Flag + zwj + Black Star + zwj + Green Square) 来表示上面带有绿星的白旗吗?然后渲染它,比如说Esperanto flag?
【问题讨论】:
对于什么可以成为 ZWJ 序列的一部分和什么不能是有限制的。 Unicode Technical Standard #51 列出了这些规则。
根据ED-15a的定义,一个良构的ZWJ序列只能包括:
Emoji=True 属性的字符)Emoji_Modifier_Base=True 属性的字符后跟具有Emoji_Modifier=True 属性的字符)所有相关属性都可以在this data file中找到。
U+2605 BLACK STAR 不是表情符号字符(而且它显然也不是这些类型的序列之一),因此在撰写本文时它不适用于 ZWJ 序列,但您可以替换U+2B50 WHITE MEDIUM STAR(这是一个表情符号)代替。除此之外,?️ 和? 是公平的游戏。
关于 U+1F3F3 WAVING WHITE FLAG 的旁注:此字符是一个表情符号,但它具有Emoji_Presentation=False 属性,这意味着它旨在显示为文本样式(单色而不是多彩)默认情况下。要强制 emoji-style 显示,必须将 U+FE0F VARIATION SELECTOR-16 附加到它。建议始终为Emoji_Presentation=False 的字符包含这些变体选择器。
U+2B50 WHITE MEDIUM STAR 也是此类表情符号呈现序列的有效基础,但默认情况下它具有Emoji_Presentation=True,因此变体选择器是完全可选的。同时,U+1F7E9 大绿色正方形 不是 表情符号演示序列的有效基础,因此 绝不能 后跟 VARIATION SELECTOR-16。我知道,这很复杂。
所有这一切的意思是,对于要使用的代码点的精确序列,您有两种选择,这两种选择都同样有效。要么:
?️⭐?<U+1F3F3, U+FE0F, U+200D, U+2B50, U+200D, U+1F7E9>
或者:
?️⭐️?<U+1F3F3, U+FE0F, U+200D, U+2B50, U+FE0F, U+200D, U+1F7E9>
【讨论】:
我注意到您对创建世界语标志感兴趣,但我认为字体渲染比仅仅排列代码点更复杂。
您的蛮力方法不起作用“as is”。
<div>
🏳️‍★‍🟩
</div>
Unicode 标准在Recommended Emoji ZWJ Sequences, v13.0 中说:
以下是推荐的 emoji zwj 序列,它们使用 U+200D ZERO WIDTH JOINER (ZWJ) 将字符连接成单个 字形如果可用。 当不可用时,ZWJ 字符是 忽略并显示一个单独的表情符号的后备序列。因此 仅应在回退的情况下支持 emoji zwj 序列 顺序对观众来说也是有意义的。
我想知道字体渲染机制的哪一部分将负责检查“可用性”(即支持某个Unicode版本的渲染引擎,或应用程序,或字体),并猜测“字体”。
所以我在Emoji fonts 上看到了这篇文章,确实,字体文件可以包含关于连字替换的数据,例如,参见OpenType。 Microsoft 提供了一个名为VOLT 的工具,它允许定义连字。
我对字体设计一无所知,但我会尝试使用字体编辑器 (sketched here) 创建一个彩色标志字形,并定义连字替换。 (没有默示保证;))
【讨论】: