Рейтинг:  5 / 5

Звезда активнаЗвезда активнаЗвезда активнаЗвезда активнаЗвезда активна
 

Доброе утро, понадобилось тут недавно закинуть файлы по ftp на сайт для дальнейшей обработки сайтом. Речь пойдет не про ftp, а про то, что сайты не любят русских букв в именах файлов и пробелы. Собственно для преобразования имен отправляемых файлов и написал функцию транслитерации, для замены кириллицы в латиницу. Прототип был украден, шлифанут под конкретную задачу и выложен тут для того, чтоб все знали :)

 

Сначала код

 

Функция Транслит(Вход) 
    Коды = Новый Соответствие;
    Коды.Вставить(" ","");
Коды.Вставить("ё","yo"); Коды.Вставить("Ё","Yo"); Нач = КодСимвола("А"); Англ = "A" "B" "V" "G" "D" "E" "Zh" "Z" "I" "Y" "K" "L" "M" "N" "O" "P" "R" "S" "T" "U" "F" "Kh" "Ts" "Ch" "Sh" "Shch" "" "Y" "" "E" "Yu" "Ya" "a" "b" "v" "g" "d" "e" "zh" "z" "i" "y" "k" "l" "m" "n" "o" "p" "r" "s" "t" "u" "f" "kh" "ts" "ch" "sh" "shch" "" "y" "" "e" "yu" "ya"; Для К = Нач по КодСимвола("я") Цикл Коды.Вставить(Символ(К), СтрПолучитьСтроку(Англ, К - Нач + 1)); КонецЦикла; Выход = ""; Для К=1 по СтрДлина(Вход) Цикл Бкв = Сред(Вход,К,1); Зн = Коды.Получить(Бкв); Выход = Выход + ?(Зн = Неопределено, Бкв, Зн); КонецЦикла; Возврат Выход;

КонецФункции

А теперь пояснения построчно:

Коды - соответствие русских букв английским. Можно было бы его заполнить в коде, но код был бы очень длинным. По 2 строки на каждую букву (большая и маленькая). Поэтому заполнять её будем в цикле от большой буквы "А" до маленькой "я".

Англ - многострочная строка, в каждой строке которой лежит аналог на английском. Это потому, что одной русской букве часто соответствует две английских.

Из этого цикла выбивается буква "ё", которая в кодовой таблице не после "е", а отдельно где-то спрятана. Та же ситуация и по пробелу. Поэтому эти соответствия добавляем вне цикла.

Дальше все просто, в цикле берем символ из исходной строки, если он есть в соответствии, то меняем его, если нет, то оставляем как есть и прибавляем к результирующей строке.

 

Минусом является то, что много операций по инициализации соответствия выполняется при каждом вызове этой функции. Если алгоритм предполагает многократные вызовы, то объявление переменной содержащей соответствие  и его инициализацию надо вынести за пределы функции.

А плюсом является то, что у нас всего одна функция. В случае, если вызовов функции мало или в некоторых случаях она может и вообще не вызываться, то зачем нам держать в памяти инициализированное соответствие?

 

Собственно все, всем пока!!!

 

Авторизуйтесь пожалуйста