o' → oʻ：懂得乌兹别克语的替换 · Ipak

> 人们用普通撇号输入乌兹别克语。Ipak Davlat 自己显示正确的符号——而且不动英语的 King's。

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

[文章] · [阶段 4 · 工作字体]

# o' → oʻ：懂得乌兹别克语的替换

人们用普通撇号输入乌兹别克语。Ipak Davlat 自己显示正确的符号——而且不动英语的 King's。

乌兹别克拉丁字母里有两个特别的符号。**ʻ**，在字母 Oʻ 和 Gʻ 里，如 Oʻzbekiston。还有 **ʼ**——图提克符号（tutuq belgisi），一个分隔符号，如 maʼno。在 Unicode 里它们有自己的编号：U+02BB 和 U+02BC。

实际上几乎没有人这样输入。人们用键盘敲普通撇号 '，或排版引号 ‘，甚至反引号 `。Windows 内置的乌兹别克语布局只有西里尔字母的（Uzbek Cyrillic）；乌兹别克拉丁布局不存在，也没有内置办法输入 ʻ（U+02BB）。在 Word 里可以这样得到符号：输入 02BB，再按 Alt+X。

所以标牌上各种写法会同时出现。我们认定：无论输入的是什么，字体都应该显示正确的样子。

![键盘输入的内容与 Ipak Davlat 显示的内容](https://ipak.xronocode.com/images/p/typed-quotes/typed-vs-result.png)

*左边是键盘输入的内容，右边是 Ipak Davlat 在标记为乌兹别克语的文本中显示的内容。 Ipak；用 HarfBuzz（hb-view）排出：左边关闭替换（-calt），右边 --language=uz；字体——SIL OFL 1.1 · CC BY 4.0 · Ipak*

## 它是怎样工作的

现代字体（OpenType 格式）里，除了字母的图形，还存着规则。一些规则移动字母——那是紧排。另一些根据相邻字符把一个字符换成另一个。这样的替换称为上下文替代，简称 **calt**。

浏览器和许多程序默认开启 calt。用户什么键都不用按：他敲 o'zbek，看到的是 oʻzbek。

**说明.** 替换只改变外观。文本里保留的还是输入的那个字符。如果复制这个词或用搜索找它，程序看到的是撇号 '，而不是 ʻ。对记录正确性重要的文件，最好直接输入 U+02BB 和 U+02BC。字体只是让输错的文本至少看起来是对的。

## 自己的符号

我们先画了符号本身。基础字体 Overpass 没有符号 ʻ，而它的引号——圆形的“水滴”——与字母的平直切口不相配。

新符号是带平直切口的楔形。重端为一笔半笔画粗，轻端近乎尖锐。

**ʻ** 的重心在下，倾角10°。

**ʼ** 的重心在上，倾角23°。

![Ipak Davlat Bold 中的 ʻ 和 ʼ](https://ipak.xronocode.com/images/p/typed-quotes/okina-tutuq.png)

*Ipak Davlat Bold 的两个符号：重心在下的 ʻ 和重心在上的 ʼ。 Ipak；用 HarfBuzz（hb-view）排出；字体——SIL OFL 1.1 · CC BY 4.0 · Ipak*

第一版更简单：两个符号都像一道斜线，只有两端粗细不同。检验时发现，小字号下它们无法区分。现在两个剪影朝向相反的方向。

## 规则

规则有好几条，顺序很重要：先匹配到的先生效。它们作用于四个输入的字符：' ‘ ’ `。

**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' 中的引号保留。

**说明.** 按1995年正字法规则（第32条），图提克符号表示前面的元音读得长，或者它后面的元音与前面的辅音分开读。它最常出现在阿拉伯语来源的词里：maʼno（意义）、taʼlim（教育）、sanʼat（艺术）。

## 语言

对乌兹别克语有用的规则，对英语是有害的。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 之后如今触发的是“字母之间”的通则，ʻ 的位置出现了 ʼ。

![qoʻngʻiroq：错误与修正](https://ipak.xronocode.com/images/p/typed-quotes/regression-qongiroq.png)

*检验时发现的错误与修正。上一行系手工重现：符号 ʼ 为直接输入。 Ipak；用 HarfBuzz（hb-view）排出；字体——SIL OFL 1.1 · CC BY 4.0 · Ipak*

修法是用两条规则代替一条。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](https://www.unicode.org/charts/PDF/U02B0.pdf)

Unicode: General Punctuation (U+2018, U+2019). [https://www.unicode.org/charts/PDF/U2000.pdf](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](https://learn.microsoft.com/en-us/windows-hardware/manufacture/desktop/windows-language-pack-default-values)

Gʻ — Wikipedia. [https://en.wikipedia.org/wiki/Gʻ](https://en.wikipedia.org/wiki/G%CA%BB)

Uzbek alphabet — Wikipedia. [https://en.wikipedia.org/wiki/Uzbek_alphabet](https://en.wikipedia.org/wiki/Uzbek_alphabet)

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

OpenType：语言标签（UZB——乌兹别克语）。 [https://learn.microsoft.com/en-us/typography/opentype/spec/languagetags](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](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](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/lang)

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

---
页面: https://ipak.xronocode.com/zh/maqolalar/typed-quotes/ · SIL Open Font License 1.1 · avenex@xronocode.com
