试图理解现代 Unicode 的微妙之处让我头疼。特别是,代码点、字符、字形和字形之间的区别——在 最简单 的情况下,当使用 ASCII 字符处理英文文本时,它们之间都存在一对一的关系——这给我带来了麻烦。
看到这些术语是如何在像 Matthias Bynens’ JavaScript has a unicode problem或 Wikipedia’s piece on Han unification这样的文档中使用的,我发现这些概念不是一回事,将它们混为一谈很危险,但我有点努力掌握每个术语的 含义 。
Unicode 联盟提供了一个词汇表来解释这些东西,但它充满了这样的“定义”:
抽象字符 。用于组织、控制或表示文本数据的信息单元。… … 字符 。… (2) 抽象字符的同义词。(3) Unicode 字符编码的基本编码单位。… … 字形 。(1) 代表一个或多个字形图像的抽象形式。(2) 字形图像的同义词。在显示 Unicode 字符数据时,可以选择一个或多个字形来描绘特定字符。 … 字形 。(1) 在特定书写系统的上下文中,最小的独特书写单元。…
抽象字符 。用于组织、控制或表示文本数据的信息单元。…
…
字符 。… (2) 抽象字符的同义词。(3) Unicode 字符编码的基本编码单位。…
字形 。(1) 代表一个或多个字形图像的抽象形式。(2) 字形图像的同义词。在显示 Unicode 字符数据时,可以选择一个或多个字形来描绘特定字符。
字形 。(1) 在特定书写系统的上下文中,最小的独特书写单元。…
这些定义中的大多数具有听起来非常学术和正式的质量,但缺乏 任何意义 的质量,或者将定义问题推迟到另一个词汇表条目或标准部分。
所以我寻求那些比我更有学问的人的神秘智慧。这些概念中的每一个到底有什么不同,在什么情况下它们之间不会形成一对一的关系?
字符 是一个重载的术语,可以表示很多东西。
代码点 是信息的原子单位。 文本 是一系列代码点。每个代码点都是一个由 Unicode 标准赋予含义的数字。
代码单元 是编码代码点的一部分的存储 单元 。在 UTF-8 中这意味着 8 位,在 UTF-16 中这意味着 16 位。单个代码单元可以表示完整的代码点或代码点的一部分。例如,雪人字形 ( 鈽�) 是一个代码点,但有 3 个 UTF-8 代码单元和 1 个 UTF-16 代码单元。
鈽�
字素 是一个或多个代码点的序列,它们显示为单个图形单元,读者将其识别为书写系统的单个元素。例如,两者a和盲都是字素,但它们可能由多个代码点组成(例如盲,可能是两个代码点,一个用于基本字符a,一个用于分音符号;但还有一个替代的、遗留的单个代码点表示此字素)。某些代码点绝不是任何字形的一部分(例如,零宽度非连接符或方向覆盖)。
a
盲
字形 是图像,通常存储在字体 ( 字形的集合)中,用于表示字素或其部分。字体可以将多个字形组合成单个表示,例如,如果上面盲是单个代码点,则字体可以选择将其呈现为两个独立的、空间重叠的字形。对于 OTF,字体的 GSUB 和 GPOS 表包含替换和定位信息以使其工作。一个字体也可能包含同一个字素的多个替代字形。