所有 ZWJ 序列都有效吗?

Are all ZWJ sequences valid?

在创建表情符号字体时,ZERO WIDTH JOINER 的任何序列都有效吗?

例如:我可以用‍★‍ (Waving White Flag + zwj + Black Star + zwj + Green Square) 来表示一个上面有绿星的白旗?然后渲染它,比如说 Esperanto flag?

我注意到您对创建世界语标志很感兴趣,但我认为字体渲染比仅仅排列代码点更复杂。

您的蛮力方法不起作用“as is”。

<div>
    &#x1F3F3;&#xFE0F;&#x200D;&#x2605;&#x200D;&#x1F7E9;
</div>

Unicode 标准在 Recommended Emoji ZWJ Sequences, v13.0 中说:

The following are the recommended emoji zwj sequences, which use a U+200D ZERO WIDTH JOINER (ZWJ) to join the characters into a single glyph if available. When not available, the ZWJ characters are ignored and a fallback sequence of separate emoji is displayed. Thus an emoji zwj sequence should only be supported where the fallback sequence would also make sense to a viewer.

我想知道字体渲染机制的哪一部分会负责检查 "availability"(即支持某个 Unicode 版本的渲染引擎,或应用程序,或字体),并猜测 "the font".

所以我在 Emoji fonts, and indeed, font files can contain data on Ligature Substitution, see OpenType for example. Microsoft provides a tool called VOLT 上看到了这篇允许连字定义的文章。

我对字体设计一无所知,但我会尝试使用字体编辑器 (sketched here) 创建彩色标志字形,并定义连字替换。 (无默示保证;))

对于什么可以成为 ZWJ 序列的一部分,什么不能。 Unicode Technical Standard #51 列出了这些规则。

根据定义ED-15a,一个合式的 ZWJ 序列只能包含:

  • Emoji 字符(带有 属性 Emoji=True 的字符)
  • 表情符号呈现序列(一个表情符号字符后跟 U+FE0F VARIATION SELECTOR-16,所有有效组合都在 this data file 中列出)
  • 表情符号修饰符序列(一个带有 属性 Emoji_Modifier_Base=True 的字符后跟一个带有 属性 Emoji_Modifier=True 的字符)

所有相关属性都可以在this data file中找到。

U+2605 BLACK STAR 不是表情符号字符(而且它显然也不是那些类型的序列之一),因此在撰写本文时它不能用于 ZWJ 序列,但是你可以用 U+2B50 WHITE MEDIUM STAR(这是一个表情符号)代替。除此之外,️和都是公平的游戏。

关于 U+1F3F3 挥动白旗的旁注:这个字符是一个表情符号,但它有 属性 Emoji_Presentation=False,这意味着它打算显示为 文本-style(单色而不是彩色)默认。要强制显示 emoji-style,必须附加 U+FE0F VARIATION SELECTOR-16。建议始终为 Emoji_Presentation=False.

的字符包含这些变体选择器

U+2B50 WHITE MEDIUM STAR 也是此类表情符号呈现序列的有效基础,但默认情况下它具有 Emoji_Presentation=True,因此变体选择器完全是可选的。 U+1F7E9 LARGE GREEN SQUARE 同时 不是 表情符号表示序列的有效基础,因此 绝不能 后跟 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>