Функция PHP транслитерации русскоязычного текста в транслит на английском и обратно.
- Что такое "Транслитерация".
- Проблеммы двусторонней транслитерации.
- Область применения транлитерации.
- Пример функции PHP для двусторонней транслитерации.
- DEMO: Транслитирация строк онлайн.
Транслитерация — это процесс преобразования текста из одной письменности в другую на манер произношения, а не перевода смыслового значения. Корни такого решения идут из попытки сформировать из символов одного языка строку, которая обеспечит близкое в произношении строки другого языка – «Транскрипция».
Транслитерация не подразумевает двухстороннее преобразование без коллизий из-за различий в символьных наборах языков, а в некоторых случаях и фундаментальных структурных отличий. В интернете живёт много обсуждений, споров, предложений и решений в попытке реализовать двухсторонний транслит с одного языка на другой и обратно без искажения начальной строки. Но панацеи пока не найдено, хотя есть очень интересные и близкие к тому решения. Подробнее здесь.
Транслитерация нашла применение в замене строк, написанных на языках отличных от английского переводом совпадающих по произношению символов и их связок в англоязычное представление. Так как практически всё ПО и языки программирования написаны на английском, то и общение с ними должно осуществляться на их родном языке. Например, названия файлов помещаемые на сервер предпочтительно переименовывать через транслит RU в EN, так как многие сервера не поймут русскоязычных имён файлов. Тоже действие желательно применять и к URL адресам.
В примере ниже приведена PHP функция для транслита RU в EN и обратно.
function transliterate($input, $toLatin = true) { $translitTable = array( 'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e', 'ё' => 'e', 'ж' => 'zh', 'з' => 'z', 'и' => 'i', 'й' => 'y', 'к' => 'k', 'л' => 'l', 'м' => 'm', 'н' => 'n', 'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c', 'ч' => 'ch', 'ш' => 'sh', 'щ' => 'sch', 'ь' => '', 'ы' => 'y', 'ъ' => '', 'э' => 'e', 'ю' => 'yu', 'я' => 'ya', 'А' => 'A', 'Б' => 'B', 'В' => 'V', 'Г' => 'G', 'Д' => 'D', 'Е' => 'E', 'Ё' => 'E', 'Ж' => 'Zh', 'З' => 'Z', 'И' => 'I', 'Й' => 'Y', 'К' => 'K', 'Л' => 'L', 'М' => 'M', 'Н' => 'N', 'О' => 'O', 'П' => 'P', 'Р' => 'R', 'С' => 'S', 'Т' => 'T', 'У' => 'U', 'Ф' => 'F', 'Х' => 'H', 'Ц' => 'C', 'Ч' => 'Ch', 'Ш' => 'Sh', 'Щ' => 'Sch', 'Ь' => '', 'Ы' => 'Y', 'Ъ' => '', 'Э' => 'E', 'Ю' => 'Yu', 'Я' => 'Ya' ); if ($toLatin) { return strtr($input, $translitTable); } else {//echo $input; $cyr = array('а','б','в','в','г','д','е','ё','ж','з','и','й','к','л','м','н','о','п','р','с','т','у', 'ф','х','ц','ч','ш','щ','ъ', 'ы','ь', 'э', 'ю','я', 'А','Б','В','Г','Д','Е','Ё','Ж','З','И','Й','К','Л','М','Н','О','П','Р','С','Т','У', 'Ф','Х','Ц','Ч','Ш','Щ','Ъ', 'Ы','Ь', 'Э', 'Ю','Я' ); $lat = array( 'a','b','v','w','g','d','e','e','zh','z','i','y','k','l','m','n','o','p','r','s','t','u', 'f' ,'h' ,'ts' ,'ch','sh' ,'sht' ,'i', 'y', 'y', 'e' ,'yu' ,'ya','A','B','V','G','D','E','E','Zh', 'Z','I','Y','K','L','M','N','O','P','R','S','T','U', 'F' ,'H' ,'Ts' ,'Ch','Sh' ,'Sht' ,'I' ,'Y' ,'Y', 'E', 'Yu' ,'Ya' ); return $textlat = str_replace($lat, $cyr, $input); } }
Пример использования:
$originalString = 'Привет, мир!'; $transliteratedToLatin = transliterate($originalString); echo $transliteratedToLatin; // Output: "Privet, mir!" $transliteratedToCyrillic = transliterate($transliteratedToLatin, false); echo $transliteratedToCyrillic; // Output: "Привет, мир!"
В данном примере используются два метода транслита. В первом случае с помощью функции strtr транслируется строка на русском языке в английское представление. Во втором, происходит транслит строки на английском в русско-символьное представление с помощью str_replace и двух символьных массивов. В приведенном DEMO примере можно наблюдать возможные коллизии при двухстороннем транслите строки.