ObBot Wgent LiveTree Архив
Архив новостей  Архив публикаций  Разное 

Скрипт транслитерации


Страница:  1 2 3

Быстро, дёшево и качественно
Правильный генератор паролей
Language hack для любой CMS
Сложный парсер даты и времени начала и окончания мероприятия, написанных человеком
Простое решение парадокса Ферми
Thank God For The Bomb
Неверные загадки
Распахивание больших картинок на jQuery
Защита пароля от подбора брутфорсом

В CMS LiveTree, разработанном нами от начала и до конца (точнее, за исключением используемого в нём бесплатного скрипта FCKeditor, легко, впрочем, заменяемого на любой другой онлайн-редактор), до недавних пор был вот какой недочёт:
Все страницы имели адреса вида http://hostnаme.zonе/idN.htm, где N – какое-то число. Адрес такого вида легко преобразуется средствами сервера в http://hostnаme.zоne/index.php?id=N, где равный N параметр id есть ничто иное, как номер хранимого в базе MySQL объекта, соответствующего нужной странице сайта. Что, разумеется, очень просто в реализации, но очень неудобно для прямых (type-in) заходов посетителей в нужный раздел сайта.

Хотелось, чтобы, скажем, страница «Реклама» имела адрес http://hostname.zоnе/reklama.htm; более того, неплохо и для под-разделов сделать /reklama/v_gazete/zakaz.htm и /reklama/na_sayte/zakaz.htm Технически это реализуется относительно просто. Вот только вопрос: na_sayte, na_saite или na_saytye?

Для того, чтобы не отягощать CMS дополнительными полями (напомним, в LiveTree главный упор делается на простоту управления и наращивания), требовалась такая транслитерация, которая была бы по возможности 100%-обратимой. То есть, чтобы транслитерированное слово можно было "де-транслитерировать" обратно в кириллицу и получить в точности исходный текст. Кстати, требование обратимости полностью устраняет варианты таких разночтений, как классическое "Паша празднует Пасху".
Было просмотрено несколько стандартов транслитерации (http://www.transliteration.ru/, если кому интересно), и ни один из них, даже тот, который авторы назвали «Транслитерация адресной строки», не оказался полностью обратимым. В частности, нам предлагают транслитерировать:з - zж - zh 
х - h

 

 

и это бы ещё ладно - с учётом отсутствия в русском языке буквосочетаний «зх». (Если кто-то, начитавшись интернет-писанины, думает, что в нашем языке существует, к примеру, слово «безхозный», то RTFM учебник русского языка). Впрочем, не будем забывать про аббревиатуры, в которых сочетания могут быть любыми.
А дальше идут: с - sц - cч - chш - sh
щ - shch 

 

Тут и вполне правильно написанное слово «бесхозный» после двойной транслитерации превратится в «бешозный», а «веснушчатые» станут «веснущатыми». Всё же, для тех, кому эта таблица транслитерации для чего-то необходима, приводим её целиком:а - a б - b в - v г - g д - d е - e ё - yo ж - zh з - z и - i й - j к - k л - l м - m н - n о - о п - p р - r с - s т - t у - u ф - f х - h ц - c ч - ch ш - sh щ-shch ъ - ' ы - y ь - ._ э - e- ю - yu я - ya



Особенно "удались" авторам твёрдый знак, заменённый крайне недружественным к веб-программированию апострофом, и мягкий знак - им, очевидно, будет оканчиваться каждое предложение.

В итоге, было принято нелёгкое решение: транслитерация URL по собственной таблице. Нелёгким оно было даже не в силу технической или лингвистической сложности, но уже потому, что ужасно не хочется плодить новые стандарты. Поэтому, изобретя велосипед, мы выкладываем исходники разработанной пары функций rus2lat и lat2rus на наиболее популярном языке PHP.

  

А выкладываем мы его, чтобы попросить тех, кому данный скрипт оказался полезен, но кто решил его модернизировать: не жадничайте, как и мы не пожадничали. Сообщите нам, какие улучшения Вам удалось внести в данный скрипт - и мы выложим его улучшенную версию здесь же.

 

UPD от 2008-03-02: Андрей Орлов, инженер компании DreamBot, подсказал ссылку на ГОСТ 7.79-2000 Правил транслитерации кирилловского письма латинским алфавитом, принятых Межгосударственным Советом по стандартизации, метрологии и сертификации и Госстандартом России. Система Б этих Правил оказалась действительно полностью обратимой, единственное только - пришлось её чуть-чуть доработать, устранив несовместимый со стандартами URL апостроф.

Результат, как и обещали, выкладываем:

// Disclaimer: Скрипт принципиально не сохраняет регистр! Кириллица принудительно переводится в нижний, латиница - в верхний.

// Это связано с необходимостью корректной транслитерации двуязычных названий страниц. 

// Если у кого есть идеи, как обойти эту проблему - welcome! Форма отправки месага на форум - внизу.

// Регистрация не требуется.

// Использованная локале-независимая функция UpLow($s)

function UpLow(&$string,$registr='up'){
$upper = 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯABCDEFGHIJKLMNOPQRSTUVWXYZ';

$lower = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюяabcdefghijklmnopqrstuvwxyz';

if($registr == 'up') $string = strtr($string,$lower,$upper);
else $string = strtr($string,$upper,$lower);

} //function UpLow(&$string,$registr='up')

 

Пример работы (Live Demo):

Введите текст кириллицей


function rus2lat($s) { // Функция обратимой перекодировки кириллицы в транслит.
// Сначала всё переводим в верхний регистр, причём не с помощью глючной strtoupper
UpLow($s);
//а потом только кириллицу в нижний

$s=str_replace("ЫА","yha",$s);
$s=str_replace("ЫО","yho",$s);
$s=str_replace("ЫУ","yhu",$s);
$s=str_replace("Ё","yo",$s);
$s=str_replace("Ж","zh",$s);
$rus = "АБВГДЕЗИЙКЛМНОПРСТУФХЦ";
$lat = "abvgdezijklmnoprstufxc";
$s = strtr($s, $rus, $lat);
$s=str_replace("Ч","ch",$s);
$s=str_replace("Ш","sh",$s);
$s=str_replace("Щ","shh",$s);
$s=str_replace("Ъ","qh",$s);
$s=str_replace("Ы","y",$s);
$s=str_replace("Ь","q",$s);
$s=str_replace("Э","eh",$s);
$s=str_replace("Ю","yu",$s);
$s=str_replace("Я","ya",$s);
$s=str_replace(" ","_",$s); // сохраняем пробел от перехода в %20
$s=str_replace(",",".h",$s); // сохраняем запятую
$s=str_replace(""",""",$s); // сохраняем кавычки
$s=rawurlencode($s); // Разрешённые символы URL - латинские буквы, точка, минус и подчёркивание
return $s;
} // function rus2lat($s)


function lat2rus($s) { // Функция обратной перекодировки транслита в кириллицу.
$s=rawurldecode($s);
$s=str_replace(".h",",",$s);// возвращаем запятую
$s=str_replace("_"," ",$s);// возвращаем пробел
$s=str_replace("yh","Ы",$s);
$s=str_replace("yu","Ю",$s);
$s=str_replace("ya","Я",$s);
$s=str_replace("yo","Ё",$s);
$s=str_replace("shh","Щ",$s);
$s=str_replace("eh","Э",$s);
$s=str_replace("sh","Ш",$s);
$s=str_replace("ch","Ч",$s);
$s=str_replace("qh","Ъ",$s);
$s=str_replace("zh","Ж",$s);
$lat = "abvgdezijklmnoprstufxcyq";
$rus = "АБВГДЕЗИЙКЛМНОПРСТУФХЦЫЬ";
$s = strtr($s, $lat, $rus);
return $s;
} // function lat2rus($s)


 
 
  W-gent and ObBot / Архив / Архив публикаций / Создание сайта©www.ObBot.com

Наш хостинг-провайдер