Yours agent
worldwide

 
Поиск по сайтам Wgent и ObBot

   

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

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


Фальсификации при подсчёте голосов на выборах
Мобильный способ регистрации
Великое Объединение форумов
Мод удаления файлов
BackLink Checker Script - Скрипт проверки ссылок
Скрипт голосовалки
Скрипт телефонного справочника
О рейтингах
Туристическая палатка для жаркого климата
Газета Наро-Фоминский Вестник о своём новом сайте
Скрипт бронирования мест для турагентств
Скрипт транслитерации
Статья в газете Мой Город Обнинск

В 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

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