乌兹别克拉丁字母里有两个特别的符号。ʻ,在字母 Oʻ 和 Gʻ 里,如 Oʻzbekiston。还有 ʼ——图提克符号(tutuq belgisi),一个分隔符号,如 maʼno。在 Unicode 里它们有自己的编号:U+02BB 和 U+02BC。
实际上几乎没有人这样输入。人们用键盘敲普通撇号 ',或排版引号 ‘,甚至反引号 `。Windows 内置的乌兹别克语布局只有西里尔字母的(Uzbek Cyrillic);乌兹别克拉丁布局不存在,也没有内置办法输入 ʻ(U+02BB)。在 Word 里可以这样得到符号:输入 02BB,再按 Alt+X。
所以标牌上各种写法会同时出现。我们认定:无论输入的是什么,字体都应该显示正确的样子。

它是怎样工作的
现代字体(OpenType 格式)里,除了字母的图形,还存着规则。一些规则移动字母——那是紧排。另一些根据相邻字符把一个字符换成另一个。这样的替换称为上下文替代,简称 calt。
浏览器和许多程序默认开启 calt。用户什么键都不用按:他敲 o'zbek,看到的是 oʻzbek。
自己的符号
我们先画了符号本身。基础字体 Overpass 没有符号 ʻ,而它的引号——圆形的“水滴”——与字母的平直切口不相配。
新符号是带平直切口的楔形。重端为一笔半笔画粗,轻端近乎尖锐。
- ʻ 的重心在下,倾角10°。
- ʼ 的重心在上,倾角23°。

第一版更简单:两个符号都像一道斜线,只有两端粗细不同。检验时发现,小字号下它们无法区分。现在两个剪影朝向相反的方向。
规则
规则有好几条,顺序很重要:先匹配到的先生效。它们作用于四个输入的字符:' ‘ ’ `。
O 之后——仅限词内。o'zbek → oʻzbek。但在 ‘metro’ 里,o 后面的闭引号是引号,不是符号。词内它后面跟着字母,词尾则没有。这就是判据。
**G 之后——词尾也算。**乌兹别克语里有许多以 gʻ 结尾的词:bogʻ、togʻ、sogʻ。所以 bog' → bogʻ。
英语 's 的例外。King's、dog's 是所有格。如果引号后面是 s 而且词到此结束,就不放 ʻ。但 bog'siz(意为“没有园子”)在词内,那里需要 ʻ。
**词尾的 ng。**乌兹别克语里 ng 是一个字母,其后不会出现 ʻ。因此 ‘tong’ 中 ng 后的引号就是引号。词内则相反,n 后的 gʻ 常见:qoʻngʻiroq(铃)、changʻi(滑雪板)、toʻngʻich(长子)。
**字母之间是 ʼ。**其余所有位于两个字母之间的都变成图提克:ma'no → maʼno,san'at → sanʼat。词尾不放 ʼ:man' 中的引号保留。
语言
对乌兹别克语有用的规则,对英语是有害的。O'Brien 不应变成 OʻBrien,don't 不应变成 donʼt。
字体可以按语言分别启用规则。语言取自文本的标记:在网站上就是 lang 属性。我们为乌兹别克语(标签 UZB)和未标明语言的文本启用了替换。对英语、德语、法语、西班牙语、意大利语、葡萄牙语和俄语,它是关闭的。对 Overpass 自带设置的语言也是关闭的:土耳其语、阿塞拜疆语、哈萨克语、加泰罗尼亚语、荷兰语等。
这里有一个陷阱,是在检验中发现的。如果页面没有标语言,浏览器会代入界面语言——比如英语或俄语。对这些语言规则是关的,访客就看不到替换。所以建议:网站上的乌兹别克语文本要加标记——lang="uz"。
那未标记的文本呢?规则会工作。King's 在那里会得到图提克 ʼ 而不是撇号:g 和 s 之间是字母间的符号。对乌兹别克语招牌这无伤大雅,而英语文本值得加上标记。
回归:qoʻngʻiroq
最有教益的故事发生在检验中。回归是在修好另一处之后,原本正常的地方冒出的错误。
按乌兹别克语检验时发现:在 ‘tong’(“早晨”,带引号)里,闭引号变成了 ʻ。排出来成了 ‘tongʻ。我们加了一条规则:ng 之后不放符号。
下一次检验发现了阻断项——一个让字体无法发布的错误。新规则弄坏了 gʻ 在词内跟在 n 后面的词。ng 之后如今触发的是“字母之间”的通则,ʻ 的位置出现了 ʼ。

修法是用两条规则代替一条。ng 之后、词内——是 ʻ。ng 之后、词尾——引号保持引号。顺序很重要,并固定在装配中。
但关键不在修正本身。错误是我们自己引入的,修的是另一处。也就是说,光靠眼睛是守不住的。我们建立了真实词语测试。每个用例记着输入了什么、语言是什么、应该得到什么。HarfBuzz 程序用与浏览器相同的方式给文本排版,把选中的字符与期望比较。
每一条关于替换的意见都成为测试的新用例,每个用例在两个字款中各检验一遍。全部通过。测试里有 qoʻngʻiroq,有 ‘tong’,有 King's,还有标记为土耳其语、阿塞拜疆语、哈萨克语、德语和法语的文本——那里不应发生替换。
已知的限制
有一处规则坦白说无法区分。带引号的外来词,如 'pedagog',在字体看来与 bog' 一样。闭引号会变成 ʻ。只有靠词典才能区分,而字体没有词典。这个限制固定在测试里,以免它的行为悄悄改变。
结语
Ipak Davlat 的替换是五条规则和一张语言清单。它的价值不在复杂,而在于用真实词语检验过:检验时又跑了约九十个词——Fargʻona、yongʻoq、Qoʻngʻirot、moʻgʻul、musʼhaf、bemaʼni——全部正确。
给用户的建议很简单。能输入 U+02BB 和 U+02BC 就直接输。不能——就照习惯输入,把乌兹别克语文本标记为乌兹别克语。剩下的交给字体。
来源
- U+02BB、U+02BC、U+2018、U+2019 的编号与名称——Unicode 表。
- Windows 布局——Microsoft 清单“Keyboard identifiers and input method editors for Windows”。
- calt 特性与 UZB 语言标签——OpenType 规范,Microsoft Typography。
- 浏览器中的 calt:
font-variant-ligatures的normal值通常开启上下文形式——MDN。 lang属性——MDN。- 规则、语言、测试是我们的:基于 Ipak Davlat v0.1 构建,2026年10月。
链接:
- Unicode: Spacing Modifier Letters (U+02BB, U+02BC). https://www.unicode.org/charts/PDF/U02B0.pdf
- Unicode: General Punctuation (U+2018, U+2019). https://www.unicode.org/charts/PDF/U2000.pdf
- Microsoft: Keyboard identifiers and input method editors for Windows. https://learn.microsoft.com/en-us/windows-hardware/manufacture/desktop/windows-language-pack-default-values
- Gʻ — Wikipedia. https://en.wikipedia.org/wiki/Gʻ
- Uzbek alphabet — Wikipedia. https://en.wikipedia.org/wiki/Uzbek_alphabet
- OpenType:calt 特性(Microsoft Typography)。 https://learn.microsoft.com/en-us/typography/opentype/spec/features_ae
- OpenType:语言标签(UZB——乌兹别克语)。 https://learn.microsoft.com/en-us/typography/opentype/spec/languagetags
- MDN: font-variant-ligatures (contextual = calt). https://developer.mozilla.org/en-US/docs/Web/CSS/font-variant-ligatures
- MDN:lang 属性。 https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/lang
- HarfBuzz——文本排版引擎。 https://harfbuzz.github.io/