字体是怎样检验的 · Ipak

> 工作字体 Ipak Davlat 发布前检验什么、为什么检验：自动检查、四个检查方向、真实词语上的替换测试，以及用测量代替目测。

[Oʻzbekcha](https://ipak.xronocode.com/jarayon/eight-rounds/index.md) · [English](https://ipak.xronocode.com/en/jarayon/eight-rounds/index.md) · [Русский](https://ipak.xronocode.com/ru/jarayon/eight-rounds/index.md) · [Español](https://ipak.xronocode.com/es/jarayon/eight-rounds/index.md) · [Português](https://ipak.xronocode.com/pt/jarayon/eight-rounds/index.md) · [中文](https://ipak.xronocode.com/zh/jarayon/eight-rounds/index.md)

[制作过程]

# 字体是怎样检验的

工作字体 Ipak Davlat 发布前检验什么、为什么检验：自动检查、四个检查方向、真实词语上的替换测试，以及用测量代替目测。

Ipak Davlat 是 Ipak 字体库的工作字体。它建立在开放字体 Overpass 之上，其上添加了乌兹别克层：符号 ʻ 和 ʼ、带 Ў Қ Ғ Ҳ 的西里尔字母紧排、字母 Ö Ğ Ş Ç、标牌用的变体。字体在发布之前要经过检验。下面讲检验什么、为什么检验、怎样检验。

## 发布规则

只有当连续两次独立检验都没有发现需要修复的问题时，字体才会发布。如果检验之后改了什么，下一次检验就从头算起。

并非每条意见都妨碍发布。“留给未来”的愿望单独记录，转入下一个版本。妨碍发布的只有那种不修复就无法发布字体的错误：错误的符号、字母粘连、损坏的装配。

## 自动检查

先由程序检查字体。它们不评价美观，但不会放过技术错误。

**Font Bakery**——一套开放的字体检查：文件里的名称和度量、必需字符的有无、各表的正确性。Ipak Davlat 剩下的意见属于基础字体 Overpass，而不属于乌兹别克层。

**OTS（OpenType Sanitizer）**——Chrome 和 Firefox 浏览器加载网页字体前所用的检查。如果 OTS 拒绝文件，网站就干脆不显示它。Ipak Davlat 通过它而没有意见。

## 四个检查方向

程序不会告诉你，标牌在大厅另一头能不能读清。所以字体要由人来看，每人有自己的任务。

| 方向 | 检查什么 |
| --- | --- |
| 排版 | 字母间距、紧排、组合中的 ʻ ʼ 符号、排版的均匀 |
| 乌兹别克语 | 正确的字符、示例的正字法、符号替换、Ö Ğ Ş Ç 字母和西里尔字母 |
| 招牌与导视 | 大写、远看和小字号下的可读性；箭头、数字、标牌效果图 |
| 技术与授权 | 装配、自动检查、文件内的名称、对基础字体许可的遵守、字体页面文字的准确性 |

检验者拿到字体、样张页面和标准。之前改了什么、为什么改，不告诉他：这样目光保持新鲜，不会对旧错误习以为常。

**说明.** 紧排是两个具体字母之间的间距修正。比如在“ТА”这一对里，不加修正时字母之间会看到窟窿。字号是字体的大小；本文中的字号百分比按字体的全高计算。

![用 Ipak Davlat 排出的机场显示屏效果图](https://ipak.xronocode.com/images/p/eight-rounds/mockup-davlat-wayfinding.png)

*用 Ipak Davlat 排出的机场显示屏效果图：箭头、数字和中点作为标牌的一部分接受检验，而不是分开来查 Ipak；字体——SIL OFL 1.1 · CC BY 4.0 · Ipak*

## 这样的检验能发现什么

检验在 Ipak Davlat 中发现过的意见举例：

**没有位置的中点。**基础字体里“·”被标成上标符号，落到前一个字母上：“5·10”被读成“510”。详见《远看的招牌》一文。

**I 与 l、O 与 0。**标牌上远看无法区分。于是有了带尾的 l 和带斜线零的样式集。

**别的语言里的替换。**英语的 King's 变成过 Kingʻs。对英语、德语、法语、俄语和另外一些语言，替换被关闭，并为词尾的 's 做了例外。

**网站上未标记语言的文本。**如果页面没有标语言，浏览器取界面语言，替换不生效。门户上的样张都标记为乌兹别克语。

**宽度和高度不一的箭头。**箭头用同一轮廓重新画出，并有共同的中心。

最刁钻的错误不出现在基础字体里，而出现在自己的修复里。例如 ng 的规则。乌兹别克语里 ng 是一个字母，词尾的它后面不需要符号 ʻ：‘tong’ 不应变成 ‘tongʻ。为这个情况写的第一个例外开得太宽，弄坏了 qoʻngʻiroq、changʻi 和 toʻngʻich——替换功能正是为这些词存在的。另一个例子：带尾 l 起初替换了 l 的图形本身，于是 ĺ ļ ľ 和连字 fl 也一起得到了尾巴，因此与邻居粘在了一起。现在带尾 l 是一个独立的字符。

**说明.** 回归是在修好另一处之后，原本正常的地方冒出的错误。回归测试是一组每次修改后都跑一遍的例子，好让旧的问题不会悄悄坏掉。

## 真实词语测试

为了这类错误不再回来，替换由测试来检验。测试里记录着词按普通键盘的输入方式、文本的语言，以及字体应该显示的样子。例如 qo'ng'iroq 应该变成 qoʻngʻiroq，‘tong’ 应该保持 ‘tong’，而标记为英语的文本里的 King's 不变。测试用 HarfBuzz 引擎——就是浏览器里工作的那一个——在两个字款里排出每个词，把选中的字符与期望比较。

规则很简单：每一条关于替换的意见都成为测试的新一行，而测试在每次装配后运行。

![左边是普通键盘输入的文本。右边是 Ipak Davlat Bold 启用符号替换后显示的样子](https://ipak.xronocode.com/images/p/eight-rounds/calt-real-words.png)

*左边是普通键盘输入的文本。右边是 Ipak Davlat Bold 启用符号替换后显示的样子 Ipak；由 IpakDavlat-Regular.ttf 和 IpakDavlat-Bold.ttf v0.1 经 HarfBuzz 渲染；字体——SIL OFL 1.1 · CC BY 4.0 · Ipak*

测试也固定了已知的限制。带引号的以 -g 结尾的外来词，如 'pedagog'，词尾会得到 ʻ：按输入的字符，它与乌兹别克的 bogʻ 无法区分。只有靠词典才能区分，而字体没有词典。测试盯着这一点，免得这个行为悄悄改变。

## 用测量代替目测

有争议的地方用数字解决。检验时有一条意见：符号 ʻ 几乎贴住 G，约1%字号。如果这被证实，字体就不能发布。

这一对被测量了。字母大幅渲染成点阵，字号对应2000单位，计算 G 与符号轮廓之间的最短距离。结果是 Regular 145单位、Bold 119单位，即字号的7.3%和6.0%。用另一种方式做的独立测量给出了相近的数字：7.8%和7.0%。意见本身提出的阈值富余地满足。符号贴近 G 是有意的：它应读作字母 Gʻ 的一部分，而不是一个独立的引号。

意见被驳回，决定之外还记下了数字和测量方法。

![Ipak Davlat Bold 中紧挨着 G 的符号 ʻ。红线是轮廓之间的最短距离，约为字号的6%](https://ipak.xronocode.com/images/p/eight-rounds/g-okina-gap.png)

*Ipak Davlat Bold 中紧挨着 G 的符号 ʻ。红线是两轮廓之间的最短距离，约为字号的6% Ipak；由 IpakDavlat-Bold.ttf v0.1 经 HarfBuzz 渲染；字体——SIL OFL 1.1 · CC BY 4.0 · Ipak*

**说明.** 驳回一条意见不等于置之不理。只有可以核验的驳回才被允许：要写明方法、数字和独立确认。

## 由此得出的规则

**字体被检验时，不改文件。**所有检验者看的是同一个装配。修改在之后进行。

**每条替换修改都带一行测试。**

**字体页面上的数字取自字体本身。**页面在发布前由脚本生成，像紧排对数这样的数字由它自己数出，而不是手工誊写。

**愿望与修改分开。**不妨碍发布的东西等下一个版本。

## 结语

字体检验不是一次鉴定，而是好几层：程序抓技术错误，人从四个方面看排版、语言、标牌和许可，真实词语测试不让旧错误回来，有争议的地方由测量裁决。最严重的错误通常出现在自己的修复里——因此测试和“文件被检验时不去动它”的规则比任何细心都重要。

## 来源

检验工具：Font Bakery、OpenType Sanitizer（OTS）、HarfBuzz；calt 特性的说明——OpenType 规范；字体的基础——Overpass。测量与测试是我们自己的：基于 Ipak Davlat v0.1 构建，2026年10月。

链接：

Font Bakery——字体检查。 [https://github.com/fonttools/fontbakery](https://github.com/fonttools/fontbakery)

OpenType Sanitizer (OTS). [https://github.com/khaledhosny/ots](https://github.com/khaledhosny/ots)

HarfBuzz——文字排版引擎。 [https://harfbuzz.github.io/](https://harfbuzz.github.io/)

OpenType：calt 特性（Contextual Alternates）。 [https://learn.microsoft.com/en-us/typography/opentype/spec/features_ae#tag-calt](https://learn.microsoft.com/en-us/typography/opentype/spec/features_ae#tag-calt)

Overpass——Ipak Davlat 的开放基础。 [https://github.com/RedHatOfficial/Overpass](https://github.com/RedHatOfficial/Overpass)

---
页面: https://ipak.xronocode.com/zh/jarayon/eight-rounds/ · SIL Open Font License 1.1 · avenex@xronocode.com
