# “Zapf”表

# 一般表信息

“Zapf”表(经授权以传奇字体设计师 Hermann Zapf 命名)包含有关字体中各个字形的信息。从概念上讲,这些信息包括:

  • 字形代表的文本字符串
  • 一组标识符
  • 一组字体特征
  • 一组字形集合

# 文本字符串

文本字符串是字形所代表的 (Unicode) 文本。在仅给出字形流的情况下重新创建原始文本时,将使用此字符串。“a”字形将简单地映射到字符串 <U+0061>,而“ct”连字可以映射到字符串 <U+0063 U+0074>。

请注意,这不是将不同字符与字形关联的机制。一般来说,即使两个字符看起来完全相同(例如,拉丁文“A”、希腊文“Α”和西里尔文“а”),也应该用不同的字形绘制它们。对不同的字符重复使用字形可能会使 AAT 或 OpenType 字体功能无法正常工作,并且无法将字符明确地转换为字形。

# 标识符

在字体本身中,字形始终由其字形索引标识,而“post”表可以将单个名称与每个字形关联,但对可使用的字符和名称的长度有相当严格的限制。但是,字体设计者在处理字体时可能希望使用多个字形标识符。他们可能将正式的 PostScript 名称用于“post”表,但有他们喜欢使用的替代名称,或者希望在不同的 Adob​​e 集合中跟踪字形的 CID,甚至有关于字形的注释。所有这些都可以在“Zapf”表中作为字形标识符使用。

# 字体功能

在某些情况下,仅仅重新创建原始文本可能还不够。人们可能希望尽可能多地重新创建原始文档。

例如,考虑使用小型大写字母的文档。如果尝试从字形重建文档,则应用小型大写字母功能这一事实非常重要。 “Zapf”表允许字体设计者将特征与字形关联起来,以捕获此信息。

# 字形集合

具有丰富字形集合的字体可能为某个字符提供多个字形。常见示例有等高和比例数字、大小写和不大小写数字以及小型大写字母。出于 UI 目的,向用户提供有关给定字符可用的字形的信息很有用,这样他们就可以选择单词中间的特定花体字形版本,使文本看起来更好。生成一组用于特定目的(例如标点符号)的字形也很有用,即使它们代表不同的字符。

# 表格格式

# 标题

“Zapf”表格具有以下标题:

类型 名称 描述
Uint16 版本设置为 2
Uint16 (未使用) 0
UInt32 extraInfo 从表的开始到额外信息空间的开始的偏移量(添加到 GlyphInfo 中的 groupOffset 和 featOffset)

标题后面紧接着一个查找表。查找表中的值是从“Zapf”表开头到给定字形的 GlyphInfo 结构的 Uint32 偏移量。

(在“Zapf”表的版本 1 中,标题后面紧接着一个 UInt32 偏移量数组,每个字形一个。)

# GlyphInfo 结构

标题后面紧接着一个 GlyphInfo 结构数组。此数组中的每个条目大小可变;到特定 GlyphInfo 的偏移量包含在标题中的 offsets[] 数组中。GlyphInfo 结构具有以下格式:

类型 名称 描述
UInt32 groupOffset 从 extraInfo 的开头到此字形的 GlyphGroup 或 GlyphGroupOffsetArray 的字节偏移量,如果没有则为 0xFFFFFFFF
UInt32 featOffset 从 extraInfo 的开头到此字形的 FeatureInfo 的字节偏移量,如果没有则为 0xFFFFFFFF
UInt8 flags 如下所述
UInt8 num16BitUnicodes 如下所述(可能为 0)
UInt16 unicodes[] 此字形的 Unicode 代码点(见下文)
UInt16 numGlyphIDs 后面的 GlyphIdentifiers 数量(可能为 0)
GlyphIdentifier glyphIDs[] 此字形的 GlyphIdentifiers(如果有)
(UInt8 padding2[1..3] 如果需要,在数组中的下一个 GlyphInfo 之前填充到 32 位对齐)

目前唯一可用的 GlyphInfo.flags 值是 kIsCanonicalGlyphFlag (0x80),它表示这是给定 Unicode 字符串的“规范”字形。在“Zapf”表的第 2 版之前,为此目的使用了标志 GlyphIdentifier (GlyphIdentifier.kind 127)。

如果所讨论的字形是给定 Unicode 字符串的首选字形,则设置 kIsCanonicalGlyphFlag。如果字形对应于单个 Unicode 字符,则当且仅当“cmap”将该字符映射到此字形时,才应设置此位。但是,该标志可用于对应于多个字符的字形。例如,Zapfino 有两个用于“es”连字的字形,名为“e_s”和“e_s.2”。该标志是为“e_s”字形设置的,而不是为“e_s.2”字形设置的。

kIsCanonicalGlyphFlag 可用于快速生成字体所涵盖的 Unicode 代码点表。此数据也可以从“cmap”表中获取,但由于“cmap”表已针对单次查找进行了优化,因此使用“cmap”表意味着要遍历 Unicode 中的每个定义字符,并检查“cmap”是否有其映射。从“Zapf”表中获取此数据要快得多。

GlyphInfo.num16BitUnicodes 字段是以下 GlyphInfo.unicodes 数组中的 UInt16 值的数量。数组本身包含此字形所代表的唯一文本字符串(UTF-16 格式)。通常,一个字形最多表示一个字符,但为了允许 BMP 之外的字符和复杂的连字,我们使用实际的 Unicode 字符串。

同样,这不允许将同一个字形用于多个字符。即使一个字形用于多个字符(例如拉丁字母 A 和希腊字母 Α)——这本身就不是一个好主意——GlyphInfo.unicodes 数组也应该只包含其中一个。同时包含两个将表明字形映射到字符序列 <U+0040 U+0391>,而不是字符 <U+0040> 或字符 <U+0391>。

如果 GlyphInfo.num16BitUnicodes 为 0,则字形不用于表示实际文本。例如,对于字形 0 来说,情况确实如此。

# 字形标识符结构

字形标识符用于识别字形,并指示其标识符类型。其结构如下:

类型 名称 描述
UInt8 kind 这是哪种标识符
UInt8 data[] 标识符数据

GlyphIdentifier.kind 字段的定义值分为四个范围:

kind 值 类型 描述
0 到 63 Pascal 字符串 紧跟在类型字节后面的字节组成 UTF-8 格式的 Pascal 字符串;根据值的不同,此名称可能需要或不需要符合 Adob​​e 的 PostScript 字形名称指南
64 到 126 2 字节二进制 紧跟在类型字节后面的字节应被视为 16 位数量的两个字节(大端字节序)。请注意,对齐不能保证,因此读取此值的软件应按字节进行。值的解释(无论是直接数值、“名称”表索引还是其他内容)由实际值控制。有关更多详细信息,请参阅下面的描述。
127 2 字节二进制 紧跟在类型字节后面的字节应被视为 16 位标志字段的两个字节(大端字节序)。请注意,对齐不能保证,因此读取此值的软件应按字节进行。这解决了 GlyphInfo 结构原始设计中缺少标志字段的问题。
128 至 255 保留 这些值尚未定义,不得使用。

目前并非所有这些值都与特定标识符类型相关联,但使用范围允许解析器正确处理 GlyphIdentifiers,即使它们不知道其确切含义。

GlyphIdentifier.kind 字段当前定义的具体值如下:

类型 名称 描述
UInt8 类型 (UTF-8 Pascal 字符串)
0=通用 PostScript 名称(即符合所有命名约定的名称)
1=Apple PostScript 名称
2=Adobe (AGL) PostScript 名称
3=AFII PostScript 名称
4=使用 Unicode 字符命名约定的字符名称
(以下表示直接二进制值)
64=日语 CID
65=繁体中文 CID
66=简体中文 CID
67=韩语 CID
(以下表示“名称”表索引)
68=版本历史记录注释,允许设计人员跟踪字形的版本
69=设计人员的简称,旨在成为字形的简短但独特的名称
70=设计人员的长名称,如果需要,旨在成为更完整的名称
71=设计人员的使用说明,旨在指导用户在什么情况下使用字形(未使用!)
72=设计师的历史记录,包括关于此字形如何产生以及它在风格上如何适应类型的信息
(以下表示双字节标志字段)
127=标志
(变量) 名称 Pascal 字符串或二进制值,取决于类型的前两位,如上文所述。

Unicode GlyphIdentifier 仅应用于与单个 Unicode 字符对应的字形。通常,此类名称完全可以从 Unicode 标准中推断出来。但是,对于为 Unicode 私有使用区中使用的未编码脚本创建实验字体的设计者来说,此名称可能很有用。

目前,为标志 GlyphIdentifier 仅定义了一个标志:即 kIsCanonicalGlyph,0x8000。不应在“Zapf”表的版本 2 中使用此标志;而应改用 GlyphInfo.flags 字段中的 kIsCanonicalGlyphFlag。

请注意,对于任何对齐,无需单独填充 GlyphIdentifiers。使用的填充是针对整个 GlyphInfo 结构的。

# 字形组的结构

当向用户呈现用于选择特定字形的界面时,应用程序通常希望知道字体中逻辑上相关的字形集(或者可能是在设计者眼中相关的字形集)。为了适应这种情况,GlyphGroup 结构会收集有关相关字形的信息。GlyphGroup 是 GlyphSubgroup 结构的集合,其中每个命名组都有一个名称(通过“名称”表索引)和一个字形索引集合,这些字形索引的顺序由设计者决定。例如,如果字体包含给定字母的许多不同花饰,则设计者可以为该字母的所有字形创建组,其中每个组都有一个名称(例如“长尾”、“粗茎”等)。

“Zapf”表通过将每个字形与零个或多个字形组相关联来实现此目的,每个字形组又由一个或多个子组组成。有三种结构用于提供这些关联。

# GlyphSubgroup 结构

GlyphSubgroup 是创建一组字形的基本结构。GlyphSubgroup 位于 extraInfo 空间中,格式如下:

类型 名称 描述
UInt16 nameIndex 此组名称在“名称”表中的索引;值为零表示此组没有名称
UInt16 numGlyphs 此命名组中的字形索引数;此值可能为零,在这种情况下不会有字形跟随,并且此名称是整个组的名称(此约定仅适用于组中的第一个名称)
UInt16 glyphs[] 此组的字形索引。

注意:不要求 GlyphSubgroup 中的所有字形都用于同一个字符串。字体设计者可以完全自由地为字体中的所有标点符号添加一个 GlyphSubgroup。

# GlyphGroup 结构

GlyphGroup 结构是 GlyphSubgroup 的数组,如下所示:

类型 名称 描述
UInt16 numGroups 低 14 位指定定义的 GlyphSubgroups 数量;它们一个接一个地跟在这个字段后面。如果最高位为 1,则每个 GlyphSubgroup 前面都有一个 16 位标志字。第 14 位应为 0。
(变量) groups[] 此 GlyphGroup 的 GlyphSubgroups。每个组前面可能都有一个 16 位标志(取决于 numGroups 字段的高位)

下列标志可供使用:

掩码 名称 描述
0x8000 isAligned 如果此位为开,则此 GlyphSubgroup 会填充到 32 位边界
0x4000 isSubdivided 如果此位为开,则此 GlyphSubgroup 实际上是更大单个组的细分。如果此位为关,则此组是一个唯一的自包含组。应在组中用于呈现用户界面的部分中设置此位。
0x3FFF (保留) 这些位当前未定义,必须为零

# GlyphGroupOffsetArray 结构

GlyphGroupOffsetArray 结构是 GlyphGroups 偏移量的数组。它看起来像这样:

类型 名称 描述
UInt16 numGroups 低 14 位指定数组中 GlyphGroups 的偏移量。第 15 位应为 0,第 14 位应为 1。
UInt16 padding 此字段当前未使用,应设置为 0。它的存在是为了尽可能地在“Zapf”表中保持 32 位对齐。
UInt32 groupOffsets[] 与此 GlyphGroupOffsetArray 关联的 GlyphGroups 的偏移量(相对于 extraInfo)。此字段中的第一个值表示要用作给定字形的“替代形式”的组,如 OS X 上的字符调色板中所示。如果包含此字形的组不包含字形的替代形式,则第一个 groupOffset 应为 0xFFFFFFFF。

给定字形的 GlyphInfo.groupOffset 指向 GlyphGroup 或 GlyphGroupOffsetArray。每个都以一个两字节的 numGroups 字段开头,该字段的第 14 位用于区分两者。如果第 14 位为空,则这是一个 GlyphGroup。如果设置了第 14 位,则它是一个 GlyphGroupOffsetArray。

通常,如果满足以下条件,GlyphInfo.groupOffset 应该指向 GlyphGroupOffsetArray:

  • 字形属于多个字形组,或者
  • 您想要明确标记字形所属的一个组作为同一字符串的备用字形集

为了使代码更简洁,工具编写者还可以让每个 GlyphInfo.groupOffset 指向 GlyphGroupOffsetArray。

示例 让我们看几个示例,看看如何使用这些结构来表示各种字形分组。

一个简单的组 首先,在最简单的情况下,字体设计者希望在字体中包含十个不同的花饰符号,并且他们希望将它们放在一个组中,以便用户可以选择一个。在此示例中,每个符号字形的 GlyphInfo 结构将具有相同的 groupOffset 值,该偏移量将引用以下 GlyphGroup:

名称 值 描述
numGroups 0x0001 这是一个 GlyphGroup。所有 & 符号只有一个 GlyphSubgroup,并且前面没有标志字
nameIndex 300 此组名称在“名称”表中的索引(类似于“Swash Ampersands”)
nGlyphs 10 属于此组的字形数量
glyphs[] ... & 符号的十个字形索引

应用程序可以使用此信息向用户提供十个 & 符号的简单调色板以供选择。

一个组内的多个子组 在一个稍微复杂一点的示例中,设计人员仍然有十个花饰 & 符号,并希望用户看到所有这十个符号,但将它们分组到带有标签的组中,并带有一个总体标签,因此菜单看起来会像这样:

z1

名称 值 描述
numGroups 0x8003 第 14 位为清除,因此这是一个 GlyphGroup。第 16 位已设置,因此每个 GlyphSubgroup 都有一个前置标志字段。后面总共有三个 GlyphSubgroup。
flag 0x4000 此组是较大组的一个细分
nameIndex 300 “Swash Ampersands”字符串的名称索引
nGlyphs 0 当 nGlyphs 为零时,nameIndex 标识整个分组
flag 0xC000 此组是较大组的一个细分,并填充到四字节边界
nameIndex 301 ““Classic” 样式”字符串的名称索引
nGlyphs 6 Classic 样式中有六个“&”符号
glyphs[] ... 六个“&”符号的字形索引
0 两个字节的填充
flag 0x4000 此组是较大组的一个细分
nameIndex 302 ““Nouveau” 样式”字符串的名称索引
nGlyphs 4 Nouveau 样式中有四个“&”符号
glyphs[] ... 四个“&”符号的字形索引

(在实践中,只将三个 GlyphSubgroup 中的一个填充到长边界是没有意义的,但是为了说明标志的使用而包含的。)

多个组中的字形 还有一个更复杂的例子,涉及希望字形属于多个组的字体设计者。例如,我们前面示例中的十个 & 符号应具有刚刚描述的所有特征,但它们也应属于字体中所有标点符号的单独组。同样,每个 & 符号可以具有相同的 groupOffset 值,参考此 GlyphGroupOffsetArray 结构:

名称 值 描述
numGroups 0x4002 这是一个 GlyphGroupOffsetArray 结构(设置了第 14 位),其中有两个偏移量。
padding 0 填充字
offset[0] … 偏移量(相对于 extraInfo)到 GlyphGroup 结构,用于替代 & 符号(如上所述)
offset[1] … 偏移量(相对于 extraInfo)到 GlyphGroup 结构,用于标点符号字形

句号字形也是标点符号组的成员,但(与 & 符号不同)它没有可供用户选择的替代字形。其 GlyphInfo 结构将包含指向 GlyphGroupOffsetArray 的偏移量,如下所示:

名称 值 描述
numGroups 0x4002 这是一个 GlyphGroupOffsetArray 结构(设置了第 14 位),其中有两个偏移量。
padding 0 填充字
offset[0] 0xFFFFFFFF 句点没有替代字形
offset[1] … 标点符号字形的 GlyphGroup 结构的偏移量(相对于 extraInfo)

标点符号 GlyphGroup 如下所示:

名称 值 描述
numGroups 0x0001 一个 GlyphSubgroup 紧随其后,且前面没有标志字
nameIndex 350 “标点符号”字符串的名称索引
nGlyphs 40 以下数组中有 40 个标点符号字形(其中包括我们的十个 & 符号和一个句点)
glyphs[] ... 所有标点符号的字形索引(同样,包括我们的十个 & 符号和一个句点)

# FeatureInfo 结构

FeatureInfo 结构标识强制显示此字形的布局引擎输入。在许多情况下,没有指定任何内容,因为给定的字形是字符串的默认字形。例如“A”,其中不需要发生任何其他事情。但是,在多个花饰、行首或行尾花饰或上下文形式的情况下,需要更多信息来让用户知道如何在布局一行时获取此字形。(当然,应用程序可以只向用户展示字体中所有字形的调色板,但有时这可能会让人不知所措!)

这里有趣的问题之一是识别在选择某些字形时重要的上下文类型。

FeatureInfo 的格式如下:

类型 名称 描述
UInt16 context 位字段,用于标识此字形出现的上下文。注意,可能有多个位处于打开状态!零值表示上下文无关。
0x0001 = 行首
0x0002 = 行中
0x0004 = 行末
0x0008 = 字首
0x0010 = 字中
0x0020 = 字末
0x0040 = 自动分数分子
0x0080 = 自动分数分母
UInt16 nAATFeatures 用于选择此功能的 <type,selector> 对的数量
sfntFontRunFeature features[] <type,selector> 对。(此类型在 SFNTTypes.h 中定义,常量在 SFNTLayoutTypes.h 中)
UInt32 nOTTags 用于选择此功能的 4 字节功能标签的数量。
UInt32 tags[] 标签数组。

# 示例

为了帮助阐明如何表示所有这些信息,让我们看一个具体的例子。假设我们有一个包含以下(有点奇怪的)内容的字体:

z2

数字是字形索引,图像显示实际字形。以下是此字体的示例“Zapf”文件:

偏移 值 描述
0 0x00010000 版本 1.0 采用固定表示法
4 482 extraInfo 部分开始的偏移量
GlyphInfo 记录的偏移量从这里开始
8 68 字形 0 的 GlyphInfo 偏移量
12 88 字形 1 的 GlyphInfo 偏移量
16 108 字形 2 的 GlyphInfo 偏移量
20 128 字形 3 的 GlyphInfo 偏移量
24 148 字形 4 的 GlyphInfo 偏移量
28 168 字形 5 的 GlyphInfo 偏移量
32 188 字形 6 的 GlyphInfo 偏移量
36 216 字形 7 的 GlyphInfo 偏移量
40 244 字形 8 的 GlyphInfo 偏移量
44 272 字形 9 的 GlyphInfo 偏移量
48 304 字形 10 的 GlyphInfo 偏移量
52 336 字形 11 的 GlyphInfo 偏移量
56 364 字形 12 的 GlyphInfo 偏移量
60 416 字形 13 的 GlyphInfo 偏移量
64 444 字形 14 的 GlyphInfo 偏移量
字形 0 的 GlyphInfo 从这里开始
68 0xFFFFFFFF 此字形没有 GlyphGroup
72 0xFFFFFFFF 该字形没有功能信息
76 1 后面的 16 位 Unicode 值的数量
78 0x0063 'c' 的 Unicode 编码
80 1 后面的 GlyphIdentifier 数量
82 0 这是一个通用名称
84 1 字符串长度的一个字节
85 'c' UTF-8 名称“c”
86 0 用于长对齐的两个字节填充
字形 1 的 GlyphInfo 从这里开始
88 0xFFFFFFFF 此字形没有 GlyphGroup
92 0xFFFFFFFF 该字形没有功能信息
96 1 后面的 16 位 Unicode 值的数量
98 0x0066 'f' 的 Unicode 编码
100 1 后面的字形标识符的数量
102 0 这是一个通用名称
104 1 字符串长度的一个字节
105 'f' UTF-8 名称“f”
106 0 用于长对齐的两个字节填充
字形 2 的 GlyphInfo 从这里开始
108 0xFFFFFFFF 此字形没有 GlyphGroup
112 0xFFFFFFFF 该字形没有功能信息
116 1 后面的 16 位 Unicode 值的数量
118 0x0069 'i' 的 Unicode 编码
120 1 后面的字形标识符的数量
122 0 这是一个通用名称
124 1 字符串长度的一个字节
125 'i' UTF-8 名称“i”
126 0 用于长对齐的两个字节填充
字形 3 的 GlyphInfo 从这里开始
128 0xFFFFFFFF 此字形没有 GlyphGroup
132 0xFFFFFFFF 该字形没有功能信息
136 1 后面的 16 位 Unicode 值的数量
138 0x006C 'l' 的 Unicode 编码
140 1 后面的字形标识符的数量
142 0 这是一个通用名称
144 1 字符串长度的一个字节
145 'l' UTF-8 名称“l”
146 0 用于长对齐的两个字节填充
字形 4 的 GlyphInfo 从这里开始
148 0xFFFFFFFF 此字形没有 GlyphGroup
152 0xFFFFFFFF 该字形没有功能信息
156 1 后面的 16 位 Unicode 值的数量
158 0x0073 's' 的 Unicode
160 1 后面的字形标识符的数量
162 0 这是一个通用名称
164 1 字符串长度的一个字节
165 's' UTF-8 名称 's'
166 0 用于长对齐的两个字节填充
字形 5 的 GlyphInfo 从这里开始
168 0xFFFFFFFF 此字形没有 GlyphGroup
172 0xFFFFFFFF 该字形没有功能信息
176 1 后面的 16 位 Unicode 值的数量
178 0x0074 't' 的 Unicode 编码
180 1 后面的字形标识符的数量
182 0 这是一个通用名称
184 1 字符串长度的一个字节
185 't' UTF-8 名称“t”
186 0 用于长对齐的两个字节填充
字形 6 的 GlyphInfo 从这里开始
188 90 额外信息空间中的偏移量以对该字形的信息进行分组
192 0 额外信息空间相对于FeatureInfo的偏移量
196 2 后面的 16 位 Unicode 值的数量
198 0x0066 'f' 的 Unicode 编码
200 0x0069 “i”的 Unicode(请注意,我们不使用组合的 0xFB01 值,因为它仅用于兼容性)
202 2 后面的字形标识符的数量
204 1 苹果名称如下
205 2 苹果名称的长度
206 'fi' UTF-8 名称“fi”
208 2 Adobe 名称如下
209 3 Adobe 名称的长度
210 'f_i' UTF-8 名称 'f_i'
213 0 用于长对齐的三个字节的填充
字形 7 的 GlyphInfo 从这里开始
216 90 额外信息空间中的偏移量以对该字形的信息进行分组
220 0 额外信息空间相对于FeatureInfo的偏移量
224 2 后面的 16 位 Unicode 值的数量
226 0x0066 'f' 的 Unicode 编码
228 0x006C “l”的 Unicode(请注意,我们不使用组合的 0xFB02 值,因为它仅用于兼容性)
230 2 后面的字形标识符的数量
232 1 苹果名称如下
233 2 苹果名称的长度
234 'fl' UTF-8 名称“fl”
236 2 Adobe 名称如下
237 3 Adobe 名称的长度
238 'f_l' UTF-8 名称 'f_l'
241 0 用于长对齐的三个字节的填充
字形 8 的 GlyphInfo 从这里开始
244 90 额外信息空间中的偏移量以对该字形的信息进行分组
248 0 额外信息空间相对于FeatureInfo的偏移量
252 2 后面的 16 位 Unicode 值的数量
254 0x0066 'f' 的 Unicode 编码
256 0x0066 “f”的 Unicode(请注意,我们不使用组合的 0xFB00 值,因为它仅用于兼容性)
258 2 后面的字形标识符的数量
260 1 苹果名称如下
261 2 苹果名称的长度
262 'ff' UTF-8 名称“fi”
264 2 Adobe 名称如下
265 3 Adobe 名称的长度
266 'f_f' UTF-8 名称 'f_i'
269 0 用于长对齐的三个字节的填充
字形 9 的 GlyphInfo 从这里开始
272 90 额外信息空间中的偏移量以对该字形的信息进行分组
276 0 额外信息空间相对于FeatureInfo的偏移量
280 3 后面的 16 位 Unicode 值的数量
282 0x0066 'f' 的 Unicode 编码
284 0x0066 'f' 的 Unicode 编码
286 0x0069 “i”的 Unicode(请注意,我们不使用组合的 0xFB03 值,因为它仅用于兼容性)
288 2 后面的字形标识符的数量
290 1 苹果名称如下
291 3 苹果名称的长度
292 'ffi' UTF-8 名称 'ffi'
295 2 Adobe 名称如下
296 5 Adobe 名称的长度
297 'f_f_i' UTF-8 名称“f_f_i”
302 0 用于长对齐的两个字节填充
字形 10 的 GlyphInfo 从这里开始
304 90 额外信息空间中的偏移量以对该字形的信息进行分组
308 0 额外信息空间相对于FeatureInfo的偏移量
312 3 后面的 16 位 Unicode 值的数量
314 0x0066 'f' 的 Unicode 编码
316 0x0066 'f' 的 Unicode 编码
318 0x006C “l”的 Unicode(请注意,我们不使用组合的 0xFB04 值,因为它仅用于兼容性)
320 2 后面的字形标识符的数量
322 1 苹果名称如下
323 3 苹果名称的长度
324 'ffl' UTF-8 名称“ffl”
327 2 Adobe 名称如下
328 5 Adobe 名称的长度
329 'f_f_l' UTF-8 名称“f_f_l”
334 0 用于长对齐的两个字节填充
字形 11 的 GlyphInfo 从这里开始
336 90 额外信息空间中的偏移量以对该字形的信息进行分组
340 10 额外信息空间相对于FeatureInfo的偏移量
344 2 后面的 16 位 Unicode 值的数量
346 0x0063 'c' 的 Unicode 编码
348 0x0074 't' 的 Unicode 编码
350 2 后面的字形标识符的数量
352 1 苹果名称如下
353 2 苹果名称的长度
354 'ct' UTF-8 名称 'ct'
356 2 Adobe 名称如下
357 3 Adobe 名称的长度
358 'c_t' UTF-8 名称 'c_t'
361 0 用于长对齐的三个字节的填充
字形 12 的 GlyphInfo 从这里开始
364 80 该组的组信息的偏移量
368 24 额外信息空间相对于FeatureInfo的偏移量
372 2 后面的 16 位 Unicode 值的数量
374 0x0073 's' 的 Unicode
376 0x0074 “t”的 Unicode(请注意,我们不使用组合的 0xFB05 值,因为它仅用于兼容性)
378 3 后面的字形标识符的数量
380 1 苹果名称如下
381 10 苹果名称的长度
382 'stoldstyle' UTF-8 名称“stoldstyle”
392 2 Adobe 名称如下
393 12 Adobe 名称的长度
394 's_t.oldstyle' UTF-8 名称 's_t.oldstyle'
406 68 'name' 表条目如下
407 290 'name' 版本历史记录表条目
409 71 'name' 表条目如下
410 291 'name' 使用指南表格条目
412 72 'name' 表条目如下
413 292 'name' 此字形历史记录表条目
415 0 Padding
字形 13 的 GlyphInfo 从这里开始
416 80 该组的组信息的偏移量
420 10 额外信息空间相对于FeatureInfo的偏移量
424 2 后面的 16 位 Unicode 值的数量
426 0x0073 's' 的 Unicode
428 0x0074 “t”的 Unicode(请注意,我们不使用组合的 0xFB06 值;这些 Unicode 始终会被分解)
430 3 后面的字形标识符的数量
432 1 苹果名称如下
433 2 苹果名称的长度
434 'st' UTF-8 名称 'st'
436 2 Adobe 名称如下
437 3 Adobe 名称的长度
438 's_t' UTF-8 名称 's_t'
441 127 标志字段如下
442 0x8000 这是“st”字符串的默认字形
字形 14 的 GlyphInfo 从这里开始
444 80 该组的组信息的偏移量
448 44 额外信息空间相对于FeatureInfo的偏移量
452 2 后面的 16 位 Unicode 值的数量
454 0x0073 's' 的 Unicode
456 0x0074 't' 的 Unicode 编码
458 2 后面的字形标识符的数量
460 1 苹果名称如下
461 7 苹果名称的长度
462 'stfinal' UTF-8 名称 'st'
469 2 Adobe 名称如下
470 9 Adobe 名称的长度
471 's_t.final' UTF-8 名称 's_t.final'
480 0 用于长对齐的两个字节填充
额外信息空间
常见连字的功能信息从此处开始(偏移量 0)
482 0 上下文与常用连字无关
484 1 接下来是一对 AAT 样式的 对
486 1 “连字”类型
488 2 “通用连字”选择器
490 0 后面没有 OpenType 功能标签
罕见连字的特征信息从这​​里开始(偏移量 10)
492 0 上下文与罕见的连字无关
494 1 接下来是一对 AAT 样式的 对
496 1 “连字”类型
498 4 “罕见连字打开”选择器
500 1 One OpenType feature follows
502 'rlig' "Rare ligatures" OpenType tag
FeatureInfo for rare oldstyle ligatures starts here (offset 24)
506 0x0018 Context is word-start or word-middle
508 2 Two AAT-style <type,selector> pairs follow
510 1 “连字”类型
512 4 “罕见连字打开”选择器
514 8 “智能花饰”类型
518 8 “非最终花饰开启”选择器
520 1 接下来是一项 OpenType 功能
522 'rlig' “稀有连字”OpenType 标签
罕见的最终花体连字的特征信息从这​​里开始(偏移量 44)
526 0x0024 上下文是词末或行末
528 3 接下来是两个 AAT 样式的 对
530 1 “连字”类型
532 4 “罕见连字打开”选择器
534 8 “智能花饰”类型
536 2 “字尾花饰打开”选择器
538 8 “智能花饰”类型
540 6 “行末花饰打开”选择器
542 1 接下来是一项 OpenType 功能
544 'rlig' “稀有连字”OpenType 标签
“st”变体的组信息(偏移量 66)
548 0x4002 这是一个包含两个条目的 GlyphGroupOffsetArray
552 0 Padding
554 0x00000050 “st”字形的替代字形组
558 0x00000058 连字字形组
“st”变体的替代字形(偏移量 80)
562 0x0001 这是一个包含一个 GlyphSubgroup 并且没有标志的 GlyphGroup
564 0 该组没有名称
566 3 共有三个字形
568 12 字形 12
570 13 字形 13
572 14 字形 14
所有连字的组信息(偏移量 90)
574 0x8003 这是一个 GlyphGroup,包含两个带有前面标志的 GlyphSubgroup
576 0x4000 该组是一个较大组的一个细分组
578 300 “Ligatures”字符串的 'name' 表条目
580 0 没有实际的字形;这是整个 GlyphSubgroups 集合的名称
582 0x4000 该组是一个较大组的一个细分组
584 301 “Common Ligatures”字符串的 'name' 表条目
586 5 此 GlyphSubgroup 中有五个字形
588 6 字形 6 (fi)
590 7 字形 7 (fl)
592 8 字形 8 (ff)
594 9 字形 9 (ffi)
596 10 字形 10 (ffl)
598 0x4000 This group is one subdivision of a larger group
600 302 “Rare Ligatures”字符串的 'name' 表条目
602 4 此 GlyphSubgroup 中的四个字形
604 11 字形 11 (ct)
606 12 字形 13 (slong-t)
608 13 字形 13 (st)
610 14 字形 14 (s-tswash)