# meta 表
# 一般表信息
"meta" 表包含字体的元数据。 该元数据可以是二进制或文本。 它以标题开头,其结构如下:
meta 表
| 类型 | 名称 | 描述 |
|---|---|---|
| uint32_t | version | 表格式的版本,当前为1 |
| uint32_t | flags | 标志,当前未使用并设置为 0 |
| uint32_t | dataOffset | 从表开头到数据的偏移量 |
| uint32_t | numDataMaps | 表中数据图数量 |
标题后面是一系列数据图。 每个将一个四字符标签映射到表中的一系列数据:
数据地图
| 类型 | 名称 | 描述 |
|---|---|---|
| FourCharCode | tag | 指示元数据类型的标签 |
| uint32_t | dataOffset | 从表开头到此标记的数据的偏移量 |
| uint32_t | dataLength | 数据的长度。 数据不需要填充到任何字节边界。 |
标签数据可以是文本的或二进制的。 如果是文本,则应采用 UTF-8。
# 元数据标签
当前定义了以下元数据标签:
# “dlng”(设计语言)标签
“dlng”列出了该字体专门用于覆盖的语言和/或脚本。 该列表是一系列基于 IETF BCP 47 规范的以逗号分隔的 ScriptLangTags。 详细讨论如下。 标签之间可以使用空格,但不是必需的。 “cy, mi”和“cy,mi”均有效。
# “slng”(支持的语言)标签
“slng”列出了已知该字体能够支持的语言和/或脚本。 同样,此列表是一系列以逗号分隔的 ScriptLangTags。
要了解设计和支持的语言之间的区别,请考虑带重音的拉丁字母的情况。 尽管重音符号被多种语言共同使用,但重音符号的精确形状可能取决于特定语言的印刷传统。 例如,波兰人比法语更喜欢尖锐的口音。 专门为波兰语设计的带有重音符号的字体将在其“dlng”标签中包含 po-Latn,而在其“slng”标签中包含 Latn。
另一个例子,为东亚市场设计的字体通常会包含拉丁文、希腊文和西里尔文的字形,因为这些字符包含在相关的东亚字符集标准中,但将它们用于实际的拉丁文、希腊文或西里尔文文本通常并不令人满意。 。 因此,此类字体的“slng”标签中将包括 Latn、Grek 和 Cyril,但不包括“dlng”标签。
最后,简体中文和繁体中文共享的字符在字形设计上存在一些系统差异。 (最值得注意的是“骨”部首在所有使用它的字符中的绘制方式。)专门为简体中文设计的字体通常可以用于繁体中文,但任何带有“骨”部首的字符都会看起来错误 献给繁体中文的读者。 这样的字体将在其“dlng”标签中包含 Hans,但在其“slng”标签中同时包含 Hans 和 Hant。
# “appl”和“bild”标签
这些标签由 Apple 内部使用。 他们使用二进制数据,而不是文本数据。
字体设计者不限于使用这些元数据标签。 任何以大写字母开头的元数据标签(例如“Foob”)均被视为私人使用。 其他跨平台标签将根据需要添加。
(请注意,“appl”和“bild”标签严格来说是私人使用,因为它们是 Apple 内部标签。由于历史原因保留了它们的使用。)
# ScriptLangTag 值
“dlng”和“slng”元数据使用此处定义的 ScriptLangTag 值。
ScriptLangTag 表示与字体关联的特定脚本或语言。 它们基于 IETF BCP 47 规范“识别语言的标签”。 (请参阅http://tools.ietf.org/html/bcp47)。 BCP 47 标签可以包括提供不同类型限定符的各种子标签,例如语言、脚本或区域。 在BCP 47规范中,语言子标签是强制性的,其他子标签是可选的。 用于“dlng”和“slng”元数据声明的 ScriptLangTags 使用 BCP 47 语法的修改:脚本子标签是强制性的,而其他子标签是可选的。 使用以下改编自 BCP 47 的增强 BNF 语法:
ScriptLangTag = [language "-"]
script
["-" region]
*("-" variant)
*("-" extension)
["-" privateuse]
语言、脚本、区域、变体、扩展和私人使用规则的扩展以及与每个规则相关的预期语义在 BCP 47 中定义。目前,没有定义用于名称“dlng”和“slng”的扩展 ' 元数据声明,并且遇到的任何扩展都将被忽略。 解释名称“dlng”和“slng”元数据字符串的应用程序可能会忽略任何私人使用子标签序列。
子标签必须有效,才能在 BCP 47 中使用,并包含在 IANA 维护的语言子标签注册表中。 有关详细信息,请参阅 http://www.iana.org/assignments/language-subtag-registry/language-subtag-registry 和 BCP 47 第 3 节。 实现可以使用 IANA 子标签注册表的过时快照,并且不需要解释注册表中定义的每个子标签。 但是,任何被解释的子标签都必须根据注册表中的描述进行解释。
注意:OpenType Layout 脚本和语言系统标记与 BCP 47 中使用的标记不同,在创建或处理 ScriptLangTags 时不应引用。
任何不符合这些规范的 ScriptLangTag 将被忽略。
应该注意的是,BCP 47 标签中的各种元素具有不同的长度要求,这些长度要求与订购要求一起允许明确的解释。 脚本子标签的长度始终恰好是四个字符,并且源自 ISO 15924 标准。 (请参阅 http://www.unicode.org/iso15924/。)此外,语言子标签的长度不能为四个字符。
ScriptLangTag 可以表示相当具体的信息; 例如,“en-Latn-IN”代表“印度英语中使用的拉丁文字”。 然而,在大多数情况下,应该使用通用标签,并且预计“dlng”和“slng”元数据声明中使用的大多数标签将仅包含脚本子标签。 然而,可以包括语言或其他子标签,并且在某些情况下可能是合适的。 实现必须允许 ScriptLangTags 包含其他子标签,但它们也可以选择仅解释脚本子标签并忽略其他子标签。
例子:
- “Latn”表示拉丁字母(以及使用拉丁字母的任何语言或书写系统)
- “Cyrl”表示西里尔字母
- “sr-Cyrl”表示用于塞尔维亚语的西里尔字母
- “en-Dsrt”表示用德塞雷特文字书写的英语
- “汉”表示繁体中文
- “Hant-HK”表示香港使用的繁体中文
- “Jpan” 表示日语书写 — ISO 15924 将“Jpan”定义为 Han + Hiragana + Katakana 的别名
- “Kana”表示片假名文字(仅包括汉字或平假名字符)
- “Kore”表示韩语书写 — ISO 15924 将“Kore”定义为 Hangul + Han 的别名
- “Hang”表示朝鲜文字(仅指“Hang”不暗示汉字)
Unicode 标准使用 ISO 15924 脚本标识符“Zinh”(“继承”)和“Zyyy”(“未确定”)。 这些不应在“dlng”和“slng”元数据的 ScriptLangTags 中使用。 同样,永远不应该使用“Zxxx”(“未书面文档”)和“Zzzz”(“未编码脚本”)。
另一方面,Unicode 标准中未使用“Zmth”(“数学符号”)和“Zsym”(“符号”),但它们作为字体文件中的声明可能非常有用。 (事实上,它们已添加到 ISO 15924 中以供与字体相关的使用。)
对于东亚文字,“Jpan”的声明可用于涵盖平假名、片假名和汉字。 同样,“Kore”可用于覆盖朝鲜文和汉字,但仅支持朝鲜文的韩文字体应使用“Hang”。 对于中文字体,通常应使用“Hans”和“Hant”来区分简体和繁体正字法,而不是更通用的声明“Hani”。 还可以声明特定于地区的变体,例如“Hant-HK”。 在某些情况下,使用通用声明“Hani”(“Han(Hanzi、Kanji、Hanja)”)来描述字体功能(但可能不是设计目标)可能是合适的。
区域子标签的 BCP 47 规范允许大陆和次大陆区域。 例如,“039”可用于表示南欧。 不建议在 ScriptLangTag 值中使用此类扩展区域子标签,因为软件实现可能没有逻辑来与更具体的区域或与这些区域关联的语言进行适当的关联。