Транслитерация


Транслитерация — это запись кириллических слов латиницей (Анна > Anna, Самара > Samara). Её используют в загранпаспортах, водительских удостоверениях, трансграничной доставке, библиотечных каталогах и множестве других международных процессов.


Так вышло, что я недавно окунулся в эту тему, а в Википедии она раскрыта слабо. Поэтому расскажу, что к чему (спойлер — если вы думаете, что с транслитерацией всё плохо, то на самом деле всё ещё хуже).


И конечно, поскольку это Хабр — предложу open-source библиотеки для решения проблемы.


Оглавление:



Кто виноват


Транслит — это хрестоматийная ситуация «у нас 14 плохих стандартов, давайте придумаем ещё один». Весь 20 век солидные, уважаемые люди придумывали всё новые и новые стандарты транслитерации.


Как приумножаются стандарты
Как приумножаются стандарты // xkcd


Получалось у них очень, очень плохо. Например, в загранпаспорте пишут Юлия > Iuliia не потому, что МИД хочет сделать вам больно, а потому что это международный стандарт ICAO Doc 9303 [1] — Machine Readable Travel Documents.


Такое ощущение, что все стандарты писались людьми, которые ненавидят русский язык. Если для англо-американского творчества это объяснимо, то что заставило советских учёных превратить Лёгкий в Ljogkijj (ГОСТ 16876-71[2]) — решительно непонятно.


Zato nasi kosmiceskie korabli borozdili prostory vselennoj.

В 21 веке человечество оказалось с двумя наиболее распространёнными стандартами: ICO Doc 9303 (Юлия > Iuliia) и ISO 9:1995 (Юлия > Ulia), он же отечественный ГОСТ 7.79-2000[3]. Достойный результат для столетних усилий, ничего не скажешь.


Посмотрев на эту «красоту», ребята из Википедии взялись за голову и сделали нормальную схему транслитерации[4], благодаря которой у несчастной Юлии остаётся слабый шанс быть Yuliya. Международные и отечественные институты эту работу проигнорировали, к сожалению.


Yuliya, syesh yeshchyo etikh myagkikh frantsuzskikh bulok iz Yoshkar-Oly, da vypey altayskogo chayu.

Конечно, нельзя было делать совсем уж хорошо (а то кто тогда станет придумывать новые стандарты). Поэтому у Википедии ещё превращается в yeshchyo. Схема хорошо передаёт фонетику, а вот выглядит иногда не очень — оцените E > YE, Щ > SHCH и Ё > YO в этом примере.


Не остался в стороне и Яндекс. У него две схемы — отдельно для ФИО[5], отдельно для адресов[6]. Здесь наконец-то сделали Щ > SCH. Но Юрий > Yurii, а Усолье > Usole, что понравится не всем. Не забываем оставлять пространство для новых стандартов!


И Студия Лебедева туда же (в рунете ничего без неё не обходится). Когда дизайнили схему московского метро, ребята отвергли стандарт ISO, а прочие, похоже, даже не смотрели. Ну и придумали свой вариант — Мосметро[7].


Чтобы вы представляли масштаб бедствия. Я насчитал 20 схем транслитерации, некоторые из которых предусматривают альтернативные наборы правил (например, с диакритикой и без). Из них 14 считаются действующими. Четырнадцать действующих «стандартов», прямо как в комиксе xkcd.


Кстати, на Хабре тоже есть транслитерация — например, для генерации id заголовков из текста. И угадайте что? Ну да: она не следует ни одному из официальных стандартов.
Habr, chto ty delaesh, ahaha, prekrati

В качестве вишенки на торте в рунете несметное количество сервисов типа «транслитерация онлайн», которые мало того что перевирают существующие схемы, так ещё и придумывают собственные. Исходники у них закрыты, разумеется.


Есть ещё такая штука — «обратная транслитерация», когда вы восстанавливаете справедливость и превращаете Iuliia > Юлия. Тут ситуация даже хуже, чем в прямой транслитерации, потому что при записи латиницей никто никаких стандартов не соблюдает, и встречаются жуткие монстры.

Обратная транслитерация — отдельная большая тема, здесь я её не рассматриваю. Но есть отличная статья DaryaRodionova — «Как написать свой транслитератор»[8].

Теперь несколько практических рекомендаций.


Как выбрать схему (быстрый вариант)


Загранпаспорт или в/у. По умолчанию используйте ICAO Doc 9303 — это требование закона. Впрочем, есть лайфхак: если написать отдельное заявление при подаче документов, сделают паспорт с нормальной транслитерацией. Тогда подойдёт старый стандарт МВД-310[9] или Мосметро.


import iuliia

source = "Юлия Щеглова"
iuliia.translate(source, schema=iuliia.ICAO_DOC_9303)
# Iuliia Shcheglova

Если нужно обратимое преобразование (cyr–lat). Используйте ГОСТ 7.79-2000 (aka ISO 9:1995). Там есть вариант с диакритикой и без.


import iuliia

source = "Юлия, съешь ещё этих мягких французских булок из Йошкар-Олы"

iuliia.translate(source, schema=iuliia.GOST_779)
# Ulia, s?es? esё etih magkih francuzskih bulok iz Joskar-Oly

iuliia.translate(source, schema=iuliia.GOST_779_ALT)
# Yuliya, s``esh` eshhyo е`tix myagkix franczuzskix bulok iz Joshkar-Oly`

Если визуальная красота превыше всего. Используйте схему Мосметро, она сама лаконичная и приятная на вид.


import iuliia

source = "Юлия Щеглова"
iuliia.translate(source, schema=iuliia.MOSMETRO)
# Yuliya Scheglova

В остальных случаях. Используйте схему Википедии. Она лучше всех по фонетике и лишь немного уступает Мосметро визуально.


import iuliia

source = "Россия, город Йошкар-Ола, улица Яна Крастыня"
iuliia.translate(source, schema=iuliia.WIKIPEDIA)
# Rossiya, gorod Yoshkar-Ola, ulitsa Yana Krastynya

Как выбрать схему (для дотошных)


Чтобы не раздувать статью до неприличия, я сделал страницу со всеми схемами [10]. Там и сценарии использования, и фильтры, и подробные описания, и примеры. Читайте, выбирайте, что больше нравится. Все схемы уже реализованы на JavaScript, Python и Go, подключить библиотеку — минутное дело.


Здесь же перечислю вкратце только актуальные схемы с моими комментариями.


ГОСТ 7.79-2000


Универсальная схема транслитерации, международный стандарт ISO 9:1995. Громоздкая, зато обратимая. Есть вариант с диакритикой.


Юлия, съешь ещё этих мягких французских булок из Йошкар-Олы,
да выпей алтайского чаю
v v v
Ulia, s?es? esё etih magkih francuzskih bulok iz Joskar-Oly,
da vypej altajskogo cau
или
Yuliya, s``esh` eshhyo е`tix myagkix franczuzskix bulok iz Joshkar-Oly`,
da vy`pej altajskogo chayu

ГОСТ Р 52290-2004


Стандарт для транслитерации имён собственных на дорожных знаках. Неплохая, с одинарными апострофами. Много внимания написанию Е и Ё.


Юлия, съешь ещё этих мягких французских булок из Йошкар-Олы,
да выпей алтайского чаю
v v v
Yuliya, syesh' eshche etikh myagkikh frantsuzskikh bulok iz Yoshkar-Oly,
da vypey altayskogo chayu

ГОСТ Р 7.0.34-2014


Правила упрощенной транслитерации русского письма латинским алфавитом. Для библиотек и издательств. В меру приятная. Расслабленная: есть альтернативы для многих букв, можно без апострофов.


Юлия, съешь ещё этих мягких французских булок из Йошкар-Олы,
да выпей алтайского чаю
v v v
Yuliya, s''esh' eshhyo etix myagkix francuzskix bulok iz Joshkar-Oly,
da vypej altajskogo chayu
или
Yuliya, sesh eshhyo etikh myagkikh francuzskikh bulok iz Yoshkar-Oly,
da vypey altayskogo chayu

Телеграммы


Инструкция Минсвязи о порядке обработки международных телеграмм. Некрасивая, зато без апострофов.


Юлия, съешь ещё этих мягких французских булок из Йошкар-Олы,
да выпей алтайского чаю
v v v
Iuliia, sesh esce etih miagkih francuzskih bulok iz Ioshkar-Oly,
da vypei altaiskogo chaiu

ICAO DOC 9303


Стандарт Международной организации гражданской авиации. Используется МВД для ФИО в водительских удостоверениях, а МИД — в загранпаспортах. Подходит для гринкарты и вида на жительство. Используется некоторыми платёжными системами.


Юлия, съешь ещё этих мягких французских булок из Йошкар-Олы,
да выпей алтайского чаю
v v v
Iuliia, sieesh eshche etikh miagkikh frantsuzskikh bulok iz Ioshkar-Oly,
da vypei altaiskogo chaiu

UNGEGN 1987 V/18


Схема транслитерации ООН для географических названий. Основана на ГОСТ 16876-71. Такая же страшная, но до сих пор не отменена.


Юлия, съешь ещё этих мягких французских булок из Йошкар-Олы,
да выпей алтайского чаю
v v v
Julija, s?es? escё etih mjagkih francuzskih bulok iz Joskar-Oly,
da vypej altajskogo caju

BGN/PCGN


Древняя схема транслитерации ООН для географических названий. Почти без диакритики, но зачем-то оставила Ё с точками.


Юлия, съешь ещё этих мягких французских булок из Йошкар-Олы,
да выпей алтайского чаю
v v v
Yuliya, s”yesh’ yeshchё etikh myagkikh frantsuzskikh bulok iz Yoshkar-Oly,
da vypey altayskogo chayu

ALA-LC


Схема транслитерации американской Библиотеки Конгресса. Страшноватая. Есть варианты с диакритикой и без.


Юлия, съешь ещё этих мягких французских булок из Йошкар-Олы,
да выпей алтайского чаю
v v v
I?ulii?a, s?esh? eshchё etikh mi?agkikh frant?suzskikh bulok iz Ioshkar-Oly,
da vypei altaiskogo chai?u
или
Iuliia, s"esh' eshche etikh miagkikh frantsuzskikh bulok iz Ioshkar-Oly,
da vypei altaiskogo chaiu

BS 2979:1958


Схема транслитерации Британской библиотеки. Используется издательством Oxford University Press. Изящно схлопывает окончания ИЙ и ЫЙ, в остальном так себе.


Юлия, съешь ещё этих мягких французских булок из Йошкар-Олы,
да выпей алтайского чаю
v v v
Yuliya, s?esh? eshchё etikh myagkikh frantsuzskikh bulok iz Ioshkar-Ol?,
da v?pei altaiskogo chayu
или
Yuliya, s"esh' eshche etikh myagkikh frantsuzskikh bulok iz Ioshkar-Oly,
da vypei altaiskogo chayu

Научная


Великая праматерь всех схем. Используется в научных работах. Из неё вырос ГОСТ 16876-71. Достойна уважения за вклад в историю, но страшная.


Юлия, съешь ещё этих мягких французских булок из Йошкар-Олы,
да выпей алтайского чаю
v v v
Julija, s?es? escё etix mjagkix francuzskix bulok iz Joskar-Oly,
da vypej altajskogo caju

Википедия


Схема транслитерации, которую использует Википедия. Сделана на основе BGN/PCGN со значительными модификациями. Самая продуманная, звучит лучше всех и выглядит приятнее большинства прочих схем.


Юлия, съешь ещё этих мягких французских булок из Йошкар-Олы,
да выпей алтайского чаю
v v v
Yuliya, syesh yeshchyo etikh myagkikh frantsuzskikh bulok iz Yoshkar-Oly,
da vypey altayskogo chayu

Мосметро


Схема транслитерации, которую использует Московский метрополитен. Визуально самая приятная из всех, хотя уступает Википедии по фонетической точности. Придумана в Студии Лебедева, официально нигде не описана.


Юлия, съешь ещё этих мягких французских булок из Йошкар-Олы,
да выпей алтайского чаю
v v v
Yuliya, syesh esche etikh myagkikh frantsuzskikh bulok iz Yoshkar-Oly,
da vypey altayskogo chayu

Яндекс.Деньги


Правила Яндекса для банковских карт. Простая и удобная схема.


Юлия, съешь ещё этих мягких французских булок из Йошкар-Олы,
да выпей алтайского чаю
v v v
Yuliya, sesh esche etikh myagkikh frantsuzskikh bulok iz Ioshkar-Oly,
da vypei altaiskogo chayu

Яндекс.Карты


Правила Яндекса для адресов. Слегка улучшенная версия Яндекс.Денег.


Юлия, съешь ещё этих мягких французских булок из Йошкар-Олы,
да выпей алтайского чаю
v v v
Yuliya, syesh eschyo etikh myagkikh frantsuzskikh bulok iz Yoshkar-Oly,
da vypey altayskogo chayu

Как транслитерировать


Не пишите логику транслитерации с нуля — велик шанс ошибиться и получить очередную (N+1) схему транслитерации, «спасибо» за которую вам не скажут.


Не берите библиотеки с гитхаба без проверки. Все, что я смотрел — реализуют стандарт некорректно, если он чуть сложнее таблицы с однозначным соответствием.


Мы с mehanizm сделали аккуратные библиотеки с нормальными тестами для Python, JavaScript и Go. Но лучше дополнительно проверьте на паре примеров, а то вы ведь знаете этих программистов ?


UPD Больше библиотек!


  • C#, Андрей Белянин
  • Java, Антон Лаврентьев aka Homyakin
  • Java, Massita
  • PHP, Антон Перевощиков aka Fett
  • Ruby, Андрей Никифоров

Пример использования (Python):


import iuliia

# list all supported schemas
for schema_name in iuliia.Schemas.names():
    print(schema_name)

# transliterate using specified schema
source = "Юлия Щеглова"
iuliia.translate(source, schema=iuliia.ICAO_DOC_9303)
# "Iuliia Shcheglova"

# or pick schema by name
schema = iuliia.Schemas.get("wikipedia")
iuliia.translate(source, schema)
# "Yuliya Shcheglova"

Или Go:


import iuliia "github.com/mehanizm/iuliia-go"

func main() {
    translated, err := iuliia.Wikipedia.Translate("Юлия Щеглова")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(translated)
}

>> 'Yuliya Shcheglova'

Схемы транслитерации описаны декларативно в JSON, лежат в отдельном репозитории. Если я какую-то пропустил — вы знаете, что делать ?


И поделитесь в комментариях — приходилось вам сталкиваться с транслитерацией по работе или в жизни? Какие впечатления?




Ссылки по тексту:


  1. ICAO Doc 9303
  2. ГОСТ 16876-71
  3. ГОСТ 7.79-2000, он же ISO 9:1995
  4. Схема Википедии
  5. Схема Яндекс.Денег
  6. Схема Яндекс.Карт
  7. Схема Мосметро
  8. Как написать свой транслитератор
  9. МВД 310
  10. Полное руководство по транслитерации