Транслитерация
10 Июл 2007Срочно понадобился крипт для превращения русского текста в транслит (ГОСТ). Вот, что вышло, может кому пригодится.
<?php
function transliterate($str) {
$str=strtr($str,"абвгдезиклмнопрстуфцъыь",
"abvgdeziklmnoprstufс\"y'");
$str=strtr($str,"АБВГДЕЗИКЛМНОПРСТУФЦЪЫЬ",
"ABVGDEZIKLMNOPRSTUFС\"Y'");
$str=strtr($str,
array(
"э"=>"eh", "х"=>"kh", "й"=>"jj", "ё"=>"jo", "ж"=>"zh", "ч"=>"ch", "ш"=>"sh", "щ"=>"shh", "ю"=>"yu", "я"=>"ya", "Э"=>"Eh", "Х"=>"Kh", "Й"=>"Jj", "Ё"=>"Jo", "Ж"=>"ZH", "Ч"=>"CH", "Ш"=>"SH", "Щ"=>"SHH", "Ю"=>"YU", "Я"=>"YA", "ї"=>"i", "Ї"=>"Yi", "є"=>"ie", "Є"=>"Ye"
)
);
return $str;
}
?>
Кстати, ГОСТ или ISO по транслитерации можно найти по этой ссылке.
А не быстрее ли будет обойтись одним вызовом последней функции (с двумя аргументами которая). Просто ввести туда все однобуквенные транслитерации и обойтись только вызовом ее одной. По идее должно быть быстрее. Да и логичнее, если честно
Да в принципе на функции такого масштаба, я бы сказал, что особой разницы нет. Просто так сразц чётко видно, что сначала идут однобуквенные, а потом многобуквенные замены. И если функцию захочется инвертировать, то эту будет проще =)
Немного лирики, но вот именно такие вещи в PHP, когда существует 10 функцией с помощью которых можно сделать одно и тоже, как-то сбивает с толку.
Да, это почти везде так =)
У меня в ЖЖ где-то болталась задачка по программированию (язык любой), которая решается как минимум 10 способами и выбранный метод характеризует тебя как программиста =)
Ja wsegda wystupal za to, cztoby otkazacca ot kirillicy, no edinomyszlennikow tak i ne naszol. :)
А ты пишешь не по ГОСТу просто… :-)
Koneczno. Prosto GOST nemnogo usczerbnyj, mne kazsecca, ne otrazsaet sowremennosti. :)
Zato GOST mozhno avtomatom transliterirovat` v kirilicu :-P
Menja smutilo samo nazwanie GOSTa — ГОСТ 16876-71 Правила транслитерации букв кирилловского алфавита буквами латинского алфавита. Poczemu kirillowskogo-to? :) W 1971 godu, nawernoe, «kirillica» bylo slowom rugateļnym. Ja znaju, czto w belorusskom jazyke jesţ wariant s latinicej, poczemu by ne sdelaţ to zse samoje s russkim jazykom?
Был. Тогда это была ещё не беларусь, а ВКЛ, если я не «запямятавал» :-)
Tipa, Welikoe Knjazsestwo Litowskoe? :)
Вялікае Княства Літоўскае or Grand Duchy of Litva :-)
Мечтаю о такой же функции, но для юникода и для всех языков сразу :)
Чтобы и «Літоўскае» и «Ελληνικά» переводило в ascii 7bit
В гугле можно найти какие-то таблицы транлитерации, например здесь http://www.uconv.com/translit.htm — и украинский, и грузинский и даже санскрит.
Но хочется готовую библиотеку с данными. Может кто встречал ?
Сенкс за готовую функцию.
В таблице перекодировки ошибки — буквы Ц и ц.
Владимир, отличный код, без лишнего. Видел ещё такую же функцию реализованную через JavaScript на http://translit.us/ Там надо в правом клавишном блоке выбрать соответствующую раскладку.
Хм… Тоже вариант =)
Тема старовата, но! Помоему логичнее сначала сделать «многобуквенные замены», а потом «однобуквенные».