
Комментарии 91
<img src="комикс_про_еще_один_стандарт.png">
</sarcasm>
Может просто это только меня задолбало, но… Во всех трех загранпаспортах, которые у меня были, три разных варианта транслитерации имени. На банковских картах — вариантов 5 видел (когда-то в анкете на выпуск карты не спрашивали как правильно транслитерировать). И это при не самом сложном имени и фамилии. Хорошо еще, что в паспорте в фамилии вместо «ё» написано «е» — иначе боюсь представить сколько разных вариантов было бы.
Даже используемая для пластиковых карт не однозначна при обратном преобразовании.
У меня 3 карты, и на всех трёх имя (Юрий) написано по разному :)
Возможно потребуется написать заявление на имя начальника отделения, но это уже зависит от того, насколько сильно развит «синдром вахтера» у работников этого отделения.
17.10. Письменное заявление об изменении написания в паспорте фамилии и/или имени гражданина, которому оформляется паспорт, буквами латинского алфавита, составленное в произвольной форме, в котором указана причина, являющаяся основанием для изменения написания фамилии и/или имени, с приложением одного из следующих подтверждающих документов и его копии: ранее выданного паспорта, свидетельства о рождении, свидетельства о заключении (расторжении) брака, свидетельства о перемене имени, вида на жительство — в случае, если заявитель желает изменить порядок упомянутого написания, предусмотренный абзацами 2 и 4 подпункта 43.4 пункта 43 настоящего Регламента.
Обратите внимание на пункт ранее выданного паспорта.
P.S. В моем случае было еще проще: у меня в момент обмена паспорта был действующий ВНЖ другого государства, где фамилия была указана в соответствии с написанием в старом паспорте.
Обратите внимание на пункт ранее выданного паспорта
Копия паспорта — это хорошо. Но причину-то какую писать?
Там вроде и «ь» и «ъ» заменяются на "_", так что с обратимостью будут проблемы.
Кстати, а не может ли быть такой ситуации, что результат/распечатка томограммы может потребоваться пациенту для передачи его (этого ответа) в зарубежную клинику? В этом случае, опять же, лучше использовать стандарт транслитерации для загранпаспортов.
Но с обратимой транслитерацией все намного проще:
— можно заполнить документы по-русски вручную, если нет доступа к системе (бывает такое);
— можно сделать автономную утилиту по генерации документов из данных исследования без связи с базой;
— можно искать в базе ФИО не боясь, что найдутся разные варианты.
С зарубежной клиникой да, поэтому и старались сделать по-возможности читаемый вариант. Но точное совпадение с загранпаспортом никому не нужно. Тем более что в загранпаспортах используют разные схемы транслитерации, они сами с собой не совпадают.
А мне в 2025м понадобилась обратимость и вот незадача - слово йод по госту мы транслитим в yod а потом обратно в ..ёд . Спасибо автору сего труда. Прикладываю свою реализацию на PHP для проекта игры в слова эрудит https://t.me/erudit_club_bot - здесь каждое слово при подборе нужно превратить в /slovo, чтобы по клике на него выводилось описание из словаря.
const TRANSLIT = [ 'А' => 'A', 'Б' => 'B', 'В' => 'V', 'Г' => 'G', 'Д' => 'D', 'Е' => 'E', 'Ё' => 'JE', 'Ж' => 'ZH', 'З' => 'Z', 'И' => 'I', 'Й' => 'Y', 'К' => 'K', 'Л' => 'L', 'М' => 'M', 'Н' => 'N', 'О' => 'O', 'П' => 'P', 'Р' => 'R', 'С' => 'S', 'Т' => 'T', 'У' => 'U', 'Ф' => 'F', 'Х' => 'KH', 'Ц' => 'C', 'Ч' => 'CH', 'Ш' => 'SH', 'Щ' => 'JSH', 'Ъ' => 'HH', 'Ы' => 'IH', 'Ь' => 'JH', 'Э' => 'EH', 'Ю' => 'JU', 'Я' => 'JA',];
public static function ruToEn(string $word): string { return strtr(mb_strtoupper($word, 'utf-8'), self::TRANSLIT); }
public static function enToRu(string $word): string
{
return mb_strtolower(strtr(mb_strtoupper($word, 'utf-8'), array_flip(self::TRANSLIT)), 'utf-8');
}
«Шшешйх… Шхешйх… А, съешйх!»
Очень неудачное сочетание символов.
hh и jh выглядят слишком синтетическими, а учитывая, что «h» — это суффикс — распознавание сочетания человеком сильно усложняется.
Как вариант:
Ъ — '
Ь — j'
ь — '
ъ — "
Правда, не сработает, если в имени будет апостроф.
У нас работает человек с апострофом в фамилии — до этого я и не знал, что такое бывает. Фамилия иностранная, правда.
Впрочем, для апострофа можно так же символ ввести… 'h Или 'h использовать для твёрдого знака
То есть, смотреть вперёд надо не на 3 буквы, а на чётность-нечётность.
И мы внезапно из регулярной грамматики попадаем в контекстно-свободную.
Пусть и очень простенькую, на одном изолированном случае (ъъ не встречается в обычной русской орфографии), и легко разбираемую даже перл-совместимыми регекспами (которые вообще являются подклассом контекстно-зависимых).

Понятно, «HH» — решение не удачное.
На будущее можно подумать, как это лучше сделать.
Пока только «JHH» в голову приходит. Это сделает грамматику регулярной, упростит считывание человеком, и, похоже, освободит «SHH» для «Щ».
Или хотя бы «Sxxeshx». А для Щ — JH.
Тут это даже сильнее выражено, чем в оригинале.
Прикольно. Это легче всего читается. «x» легко пропускается при чтении как беззвучный символ, пауза.
Щ — TH
Ъ — JH либо JJ
Ь — JY
Про «TH» для «Щ» думал, но это сочетание всем известно, и читается совсем не как «Щ». Людям будет трудно «переключаться».
«JJ» — плохое сочетание, по тем же причинам, что и «HH» — приводит к нарушению однозначности. Выше есть комментарии с теорией.
«Ь» --> «JY» возможно, но противоречит принципу «для букв, которым не соответствуют звуки, нельзя использовать буквы, для которых звуки есть».
Про «TH» для «Щ» думал, но это сочетание всем известно, и читается совсем не как «Щ».
Интересно, что на эту тему скажет Мищгол?
«JJ» — плохое сочетание, по тем же причинам, что и «HH» — приводит к нарушению однозначности. Выше есть комментарии с теорией
Поясните, пожалуйста, в каких случаях это приводит к нарушению однозначности?
По аналогии с комментарием nickolaym.
Сейчас вижу, что выразился неверно. Обратное преобразование остается однозначным, просто алгоритм будет сложнее.
Понимаю, что случай нескольких твердых знаков подряд для русского языка не характерен, но входному контракту не противоречит, и лучше бы, чтобы алгоритм на нем не ломался.
В общем, если коды будут образовывать регулярную грамматику, все будет изящнее.
Но для глаз это, конечно, ад.
./distance vectors.bin
Enter word or sentence (EXIT to break): avito
Word: avito Position in vocabulary: 1999
Word Cosine distance
— awito 0.693721
авито 0.675299
fvito 0.661414
авита 0.659454
irr 0.642429
овито 0.606189
аviто 0.598056
./distance vectors.bin
Enter word or sentence (EXIT to break): пщщпду
— пщщщпду 0.723194
пщщпд 0.721070
пщпд 0.712373
пщппду 0.704579
пщщаду 0.695897
пщщпдк 0.694641
пщпду 0.692646
ппщду 0.681183
пщщп 0.660203
пгпд 0.653649
гугл 0.649897
поопду 0.647420
ппщпду 0.643923
пщщплу 0.641619
нфтвуч 0.640587
пщщпдуюкг 0.631423
пщщпу 0.620105
gogle 0.616396
иштп 0.612234
google 0.608240
Ну, а раз все равно что-то менять, решил заодно исправить неудачные, на мой взгляд, решения («Ы», «Й», «Ё»). А «Щ» пришлось менять вынужденно, с радостью бы оставил как в ГОСТе.
В остальном предложенное решение соответствует ГОСТ.
http://gen.lib.rus.ec/book/index.php?md5=BD756272C0A86DB220B0A0BA581CA33B
Скажете, «экс» звучит не как «хэ»? Ну так и U(йууу) звучит не как У(уууу)…
Кстати, недавно решал проблему перевода из транслита в русский. Однозначного перевода не получилось, разумеется, но удалось реализовать поддержку нескольких внегласных стандартов транслитерального написания. Благо, они не взаимоисключающие в большинстве случаев. Например, буку «Ш» распознаю и как 'w' и как 'sh'. При этом 'shch' однозначно определяется как 'щ', потому что я не придумал в Русском языке слов со слогом «шч». С большинством других сложных букв аналогично получилось разобраться. Но вот мягкий/твёрдый знак, ё и ы доставляют проблемы, конечно. В первую очередь из-за того, что их при транслите или вообще не указывают или пишут «у». Т.е. без последующего прогона по словарю не обойтись.
Задача распознавания произвольного транслита интересна, да. Собственно, в статье описана попытка от такой задачи уйти.
Стандарты вообще тсранные. Вроде бы даже несколько ГОСТов есть, не говоря о прочих вариациях.
Вот если бы появился не «ещё один стандарт»(с), а один единственный обратимый стандарт транслитеризации, который все соблюдают, то было бы няшно.
При этом 'shch' однозначно определяется как 'щ', потому что я не придумал в Русском языке слов со слогом «шч»
Довольно быстро находится слово «Машчермет». Правда, это имя собственное — название ж/д станции, да ещё и заграничной…
Пояснения к сочетаниям.
yo — ё, yu — ю, ya — я — Тут всё просто. Как в русском языке эти буквы раскладываются на сочетание звуков «й+о», «й+у», «й+а». Тут всё стандартно и понятно. А вот как быть в обратном случае? У нас есть «е», но нет «э». Есть «и», но нет «ы». Нужно наоборот убрать «й» из звучания. Для этого я использовал «w» — как символ убирающий «й» из звучания. «we» («е» без «й») — «э». «wi» — «ы».
Сама по себе «w» отдельно как буква не используется, поэтому разночтений не бывает.
Для «х» используется «x» (экс). Это даёт возможность убрать разночтения из сочетаний sh, ch, zh, так как «h» сама по себе не используется.
А — A
Б — B
В — V
Г — G
Д — D
Е — E
Ё — Yo
Ж — Zh
З — Z
И — I
Й — Y
К — K
Л — L
М — M
Н — N
О — O
П — P
Р — R
С — S
Т — T
У — U
Ф — F
Х — X
Ц — C
Ч — Ch
Ш — Sh
Щ — Shh
Ь — Q
Ы — Wi
Ъ — J
Э — We
Ю — Yu
Я — Ya
(комментарий пользователя http://habrahabr.ru/users/VasakaInc/)
Щ — Shh
Ь — X
Ъ — Xh
Ё — Yo (чтобы остался вариант для Ѣ)
І — Yi
Ѣ — Ye
Ѳ — Th
Ѵ — W
Были ещё сочетания Gh и Uh. Сочетаний для букв Є и Ї не придумал (Ehh и Yyi ?).
Есть cldr с реализациями на большинстве ЯП. Но все почему-то думают, что надо делать свой велосипед с маппингом букв, что изначально неуниверсально и нестандартизировано.
По теме там нашел вот это: "Cyrillic generally follows ISO 9". То есть ничего неожиданного.
А в реализации для Java транслитерации вроде нет.
Transforms – a flexible mechanism for Unicode text conversions
Including Full/Halfwidth conversions, Normalization, Case conversions, Hex conversions, and transliterations between scripts (50+ pairs)
Это не интересный проект, а стандарт де-факто.
Java:
Transliterator cyr2lat = Transliterator.getInstance("Cyrillic-Latin");
Transliterator lat2cyr = Transliterator.getInstance("Latin-Cyrillic");
String cyr = "НОЧЬ, ПОДЪЕЗД! ночь, подъезд?";
String lat = cyr2lat.transliterate(cyr);
String cyr_lat_cyr = lat2cyr.transliterate(lat);
System.out.println(cyr);
System.out.println(cyr.length());
System.out.println(lat);
System.out.println(lat.length());
System.out.println(cyr_lat_cyr);
Выводит:
НОЧЬ, ПОДЪЕЗД! ночь, подъезд?
29
NOČʹ̱, PODʺ̱EZD! nočʹ, podʺezd?
31
НОЧЬ, ПОДЪЕЗД! ночь, подъезд?
Все правильно, все по ISO, полностью обратимо вплоть до регистра.
Только как это людям объяснить, как это на клавиатуре набрать, как передать в поле, где допустимы только буквы основной латиницы — непонятно.
Вот всегда так, готово, универсально, стандарт де-факто — а использовать нельзя.
Видимо, грамотным решением было бы написать к icu4j свой транслитератор. Так сказать, помочь им осуществить «tentative plans to add… variants for GOST».
(при транслите вы выбрали кириллицу, а надо было русский)
А ICU предлагает диакриты, да ещё составные. Их не все unicode системы поддерживают, не говоря о старых. И на клавиатуре их нет.
Под русским Вы имели в виду «Ru-En»? Или «Ru-Latin»? Все четыре варианта приводят к одному транслитератору, просто по более длинным цепочкам.
Russian-Latin/BGN; Any-Latin; Latin-ASCII; NFD; [:Nonspacing Mark:] Remove; NFKC; — такой вариант транслитирирует русский в латиницу, денормализует, уберет лишнее и приведет с compatibility форме (например индексы приведет к обычным цифрам, а евро к Е).
Но BNG же не обратима?
Они и сами так пишут: «Unicode CLDR provides other transliterations based on the U.S. Board on Geographic Names (BGN) transliterations. These are currently unidirectional — to Latin only.»
Она и в принципе не обратима («Ц» --> «TS»), и не чисто буквенная («ь» --> "'").
А фильтры — это хорошо, но здесь не помогает.
JSHПочему не JS, например? Или JC (аналогия по хвостику)? Третий символ тут никакой погоды не даёт — ни на обратимость не влияет, ни на читаемость этой псевдофонетической каши. Пожалуй, читаемость даже ухудшает.
А разве смысл транслитерации не в том, чтобы условно «любой» человек смог более-менее понятно и правильно прочитать и произнести слово?
Ну вот слово, которое вам нужно по-быстрому прочитать:
Щавелевый
Получается как:
Jshavelevihy
йшавелевихы — так прочтет обычный человек по привычке читающий латиницу.
Раз уж вы решили изобретать свой велосипед с двойными HH JSH итд, то раз уж всё-равно всем вашим работникам придется зазубривать новую кодировку букв, то не проще было сразу придумать какой-нибудь цифровой код? Ну допустим X1 X2 X3 X4 итд. учить надо меньше и глаза не пытаются произносить буквы так, как всех учили в школе, ломая прошлую выучку.
А представьте, что будет, когда человек, запомнивший все ваши «стандарты» вдруг решит написать кому-то сообщение, находясь за границей, используя транскрипцию? Он по новой памяти начнет набирать HH JSH итд. И кто его тогда поймет? Думаю только его коллега..)
Кстати вопрос, почему «обычный человек» читает «y» как «ы»? Какой язык надо было в школе учить для этого?
Да и «Helen» читается вроде как «Элен». Откуда «х»?
По поводу «X1 X2» — это сарказм, да?
Хотелось как раз минимально испортить ГОСТ, но добиться обратимости.
А «привычная» транслитерация, к сожалению, у всех разная.
каждую исходную букву преобразовывать независимо от остальных (без сложностей вроде «в начале / в конце слова» и т.п.)
Ну, кстати, для человека это может быть наоборот удобней, но сложнее для обработки (возможно понадобится уже КС грамматика).
Мою фамилию «Гаврилюк» в Казахстане писали Gavrilyuk, в России — Gavriliuk, в Молдавии — Gavriliuc, а в Украине — Havryliuk
Украина в этом плане вообще — впереди планеты всей, они умудряются переводить даже имена
К примеру, мои инициалы А.Н. (Александр Николаевич) здесь пишут О.М. (Олександр Миколайович)
В итоге я не узнаю свое имя в документах ни на кириллице, ни на латинице :-(
Хочу поделиться мыслями по поводу вот этой фразы:
код все равно длинны 3 и не стандартный
Во-первых, по-моему, можно ограничиться заменой Щ -> JS (длина — 2, но префикс взят от гласных)
А во-вторых, правильно писать «длины» и «нестандартный» (а точнее — «длиной» и «нестандартен»)
Всех благ! :-)
del
Обратимая транслитерация кириллицы