o' → oʻ: a substitution that knows Uzbek · Ipak

> People type Uzbek with an ordinary apostrophe. Ipak Davlat shows the correct signs by itself — and leaves the English King's alone.

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

[Process]

# o' → oʻ: a substitution that knows Uzbek

People type Uzbek with an ordinary apostrophe. Ipak Davlat shows the correct signs by itself — and leaves the English King's alone.

In the Uzbek Latin alphabet there are two special signs. **ʻ** in the letters Oʻ and Gʻ, as in Oʻzbekiston. And **ʼ** — the tutuq sign (tutuq belgisi), a separator sign, as in maʼno. In Unicode they have their own numbers: U+02BB and U+02BC.

In practice, almost no one types them that way. People type the ordinary keyboard apostrophe ', or the typographic quote ‘, or even the backtick `. Among the built-in Windows layouts for Uzbek there is only the Cyrillic one (Uzbek Cyrillic); there is no Uzbek Latin one, and there is no built-in way to type ʻ (U+02BB). In Word the sign can be produced like this: type 02BB and press Alt+X.

So all the variants turn up on plates at once. We decided that the font must look right no matter what was actually typed.

![What is typed and what Ipak Davlat shows](https://ipak.xronocode.com/images/p/typed-quotes/typed-vs-result.png)

*Left — what is typed on the keyboard; right — what Ipak Davlat shows in text marked up as Uzbek. Ipak; set with HarfBuzz (hb-view): left with substitution off (-calt), right with --language=uz; font — SIL OFL 1.1 · CC BY 4.0 · Ipak*

## How it works

In a modern font (the OpenType format), rules are stored alongside the letter drawings. Some move letters — that is kerning. Others replace one character with another depending on its neighbors. Such a replacement is called a contextual alternate, **calt** for short.

Browsers and many programs enable calt by default. The user does not need to press anything: they type o'zbek and see oʻzbek.

**Note.** The substitution changes only the appearance. The text itself keeps the character that was typed. If you copy the word or search for it, the program will see the apostrophe ', not the ʻ. For documents where the correct encoding matters, it is better to type U+02BB and U+02BC directly. The font only makes wrongly typed text at least look right.

## Our own signs

First we drew the signs themselves. The base, Overpass, had no ʻ sign, and its quotation mark — a round “teardrop” — did not fit the straight cuts of the letters.

The new signs are wedges with straight cuts. The heavy end is one and a half strokes thick; the light end is almost pointed.

The **ʻ** has its mass at the bottom and a 10° slant.

The **ʼ** has its mass at the top and a 23° slant.

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

*Two signs of Ipak Davlat Bold: ʻ with its mass at the bottom, and ʼ with its mass at the top. Ipak; set with HarfBuzz (hb-view); font — SIL OFL 1.1 · CC BY 4.0 · Ipak*

The first version was simpler: both signs looked like a slash and differed only in the thickness of their ends. During checking it turned out that at small sizes they could not be told apart. Now the silhouettes face in different directions.

## The rules

There are several rules, and the order matters: the first one that matches fires. They work on four typed characters: ' ‘ ’ `.

**After an O — only inside a word.** o'zbek → oʻzbek. But in ‘metro’ the closing quote after the o is a quote, not a sign. Inside a word, a letter follows it; at the end, nothing does. That is the tell.

**After a G — also at the end of a word.** Uzbek has many words ending in gʻ: bogʻ, togʻ, sogʻ. So bog' → bogʻ.

**An exception for the English 's.** King's, dog's — the possessive. If an s follows the quote mark and the word ends there, no ʻ is placed. But bog'siz (without a garden) is inside a word; the ʻ is needed there.

**ng at the end of a word.** In Uzbek, ng is a single letter, and a ʻ never follows it. So in ‘tong’ the quote mark after ng is a quote. Inside a word, on the contrary, gʻ after n does occur: qoʻngʻiroq (bell), changʻi (skis), toʻngʻich (firstborn).

**Between letters — ʼ.** Everything else that stands between two letters becomes a tutuq: ma'no → maʼno, san'at → sanʼat. At the end of a word no ʼ is placed: in man' the quote mark stays.

**Note.** Under the 1995 orthography rules (rule 32), the tutuq sign shows that the vowel before it is pronounced long, or that the vowel after it is pronounced separately from the preceding consonant. Most often it occurs in words of Arabic origin: maʼno (meaning), taʼlim (education), sanʼat (art).

## Languages

A rule useful for Uzbek is harmful for English. O'Brien must not become OʻBrien, nor don't — donʼt.

A font can enable rules differently for different languages. The language is taken from the text's markup: on a website, that is the lang attribute. We enabled the substitution for Uzbek (the UZB tag) and for text with no language given. For English, German, French, Spanish, Italian, Portuguese, and Russian it is off. It is also off for the languages for which Overpass has its own settings: Turkish, Azerbaijani, Kazakh, Catalan, Dutch, and others.

There is a trap here, found during checking. If a page does not specify a language, the browser substitutes the interface language — English or Russian, say. For those the rule is off, and the visitor will not see the substitution. Hence the advice: **Uzbek text on a website must be marked up** — lang="uz".

And what happens in unmarked text? The rules work. There, King's would get the tutuq ʼ instead of the apostrophe: between the g and the s, the sign stands between letters. For an Uzbek sign this is not terrible, but English text is worth marking up.

## The regression: qoʻngʻiroq

The most instructive story happened during checking. A regression is an error that appears in a place that already worked, after something else was fixed.

A check focused on the Uzbek language found: in ‘tong’ (morning, in quotes) the closing quote turns into a ʻ. The result was ‘tongʻ. We added a rule: after ng, do not place the sign.

The next check found a blocker — an error that makes the font unreleasable. The new rule broke the words where gʻ stands after an n inside a word. After ng, the general “between letters” rule now fired, and a ʼ appeared instead of the ʻ.

![qoʻngʻiroq: the error and the fix](https://ipak.xronocode.com/images/p/typed-quotes/regression-qongiroq.png)

*An error found during checking, and its fix. The top row is reproduced by hand: the ʼ sign is typed directly. Ipak; set with HarfBuzz (hb-view); font — SIL OFL 1.1 · CC BY 4.0 · Ipak*

The fix was two rules instead of one. After ng inside a word — ʻ. After ng at the end of a word — the quote stays a quote. The order of the rules matters and is fixed in the build.

But the fix is not the main point. We introduced the error ourselves while fixing another one. That means such things cannot be held in check by eye. We started a test on real words. Each case records what is typed, in which language, and what should come out. The HarfBuzz program shapes the text the same way a browser does and compares the chosen characters with the expected ones.

Every substitution comment that is found becomes a new line of the test, and every case is checked in both weights. All pass. The test includes qoʻngʻiroq, ‘tong’, King's, and texts marked up as Turkish, Azerbaijani, Kazakh, German, and French, where no substitution must happen.

## A known limitation

One case the rule honestly cannot tell apart. A borrowed word ending in -g inside quotes, such as 'pedagog', looks to the font the same as bog'. The closing quote becomes a ʻ. Only a dictionary could tell them apart, and the font does not know one. The limitation is pinned in the test, so that its behavior does not change unnoticed.

## The result

The substitution in Ipak Davlat is five rules and a list of languages. Its value is not in complexity but in being tested on real words: during checking about ninety more words were run — Fargʻona, yongʻoq, Qoʻngʻirot, moʻgʻul, musʼhaf, bemaʼni — all correct.

The advice for users is simple. If you can, type U+02BB and U+02BC. If not, type as you are used to, and mark up Uzbek text as Uzbek. The font will do the rest.

## Sources

The numbers and names of the characters U+02BB, U+02BC, U+2018, U+2019 — the Unicode charts.

The Windows layouts — the Microsoft list “Keyboard identifiers and input method editors for Windows”.

The calt feature and the UZB language tag — the OpenType specification, Microsoft Typography.

calt in browsers: the normal value of font-variant-ligatures usually enables contextual forms — MDN.

The lang attribute — MDN.

The rules, the languages, and the test are ours, on the Ipak Davlat v0.1 build, October 2026.

Links:

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: the calt feature (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: language tags (UZB — Uzbek). [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: the lang attribute. [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 — a text-shaping engine. [https://harfbuzz.github.io/](https://harfbuzz.github.io/)

---
Page: https://ipak.xronocode.com/en/jarayon/typed-quotes/ · SIL Open Font License 1.1 · avenex@xronocode.com
