IPAK

Статьи · Этап 4 · Рабочий шрифт

o' → oʻ: подстановка, которая знает узбекский

Люди набирают узбекский обычным апострофом. Ipak Davlat показывает правильные знаки сам — и не трогает английское King's.

В узбекской латинице два особых знака. ʻ в буквах Oʻ и Gʻ, как в Oʻzbekiston. И ʼ — знак тутук (tutuq belgisi), разделительный знак, как в maʼno. В Юникоде у них свои номера: U+02BB и U+02BC.

На деле их почти никто так не набирает. Люди печатают обычный апостроф с клавиатуры, ', или типографскую кавычку ‘, или даже обратный штрих `. Среди встроенных раскладок Windows для узбекского есть только кириллическая (Uzbek Cyrillic); узбекской латинской нет, и встроенного способа набрать ʻ (U+02BB) нет. В Word знак можно получить так: набрать 02BB и нажать Alt+X.

Поэтому на табличках встречаются все варианты сразу. Мы решили, что шрифт должен выглядеть правильно независимо от того, что именно набрано.

Что набрано и что показывает Ipak Davlat
Слева — что набрано с клавиатуры, справа — что показывает 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.

Свои знаки

Сначала мы нарисовали сами знаки. У основы, Overpass, знака ʻ не было, а её кавычка — круглая «капля» — не подходила к прямым срезам букв.

Новые знаки — клинья с прямыми срезами. Тяжёлый конец в полтора штриха, лёгкий почти острый.

  • У ʻ масса внизу, наклон 10°.
  • У ʼ масса вверху, наклон 23°.
ʻ и ʼ в Ipak Davlat Bold
Два знака 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 — это кавычка. Внутри слова, напротив, gʻ после n встречается: 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 теперь срабатывало общее правило «между буквами», и вместо ʻ появлялся ʼ.

qoʻngʻiroq: ошибка и исправление
Ошибка, найденная при проверке, и исправление. Верхняя строка воспроизведена вручную: знак ʼ набран напрямую. Ipak; набрано HarfBuzz (hb-view); шрифт — SIL OFL 1.1 · CC BY 4.0 · Ipak

Исправление — два правила вместо одного. После ng внутри слова — ʻ. После ng в конце слова — кавычка остаётся кавычкой. Порядок правил важен и закреплён в сборке.

Но главное не исправление. Ошибку внесли мы сами, исправляя другую. Значит, глазами такие вещи не удержать. Мы завели тест на реальных словах. Каждый случай — что набрано, на каком языке и что должно получиться. Программа HarfBuzz раскладывает текст тем же способом, что браузер, и сравнивает выбранные знаки с ожидаемыми.

Каждое найденное замечание о подстановке становится новой строкой теста, и каждый случай проверяется в обоих начертаниях. Все проходят. В тесте есть и qoʻngʻiroq, и ‘tong’, и King's, и тексты, размеченные турецким, азербайджанским, казахским, немецким и французским, — там замены быть не должно.

Известное ограничение

Одно место правило честно не различает. Заимствованное слово на -g в кавычках, например '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 — таблицы Юникода.
  • Раскладки Windows — список Microsoft «Keyboard identifiers and input method editors for Windows».
  • Фича calt и языковой тег UZB — спецификация OpenType, Microsoft Typography.
  • calt в браузерах: значение normal у font-variant-ligatures обычно включает контекстные формы — MDN.
  • Атрибут lang — MDN.
  • Правила, языки, тест — наши, на сборке Ipak Davlat v0.1, октябрь 2026 года.

Ссылки: