Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   транслитерация (http://www.flasher.ru/forum/showthread.php?t=159381)

Abdilxamidov 30.06.2011 12:46

транслитерация
 
можно ли на as3 написать ф-цию транслитерации кирилицы в латиницу?

saikspaik 30.06.2011 12:47

Можно.

kackbip 30.06.2011 12:50

Конечно.
Я бы сделал как-то так:
1) Определил в Dictionary соответствия кириллице литиницы
2) Пробегался бы по символам и менял бы их в соответствии с Dictionary

ПС: урааа... я дошкольник!

Abdilxamidov 30.06.2011 12:51

а намекните, каким образом. На php это можно сделать с помощью strstr(), а здесь какой метод String нужно использовать?

kackbip 30.06.2011 12:55

а что надо? Заменить символ? Лучше новую строку наверное формировать.

Цитата:

На php это можно сделать с помощью strstr()
кстати, наиуродливейшее название функции :)

Abdilxamidov 30.06.2011 13:05

Цитата:

Сообщение от kackbip (Сообщение 1007634)
а что надо? Заменить символ? Лучше новую строку наверное формировать.

Нужно название файла перевести в латиницу для дальнейшего аплода

kackbip 30.06.2011 13:18

ясно, ну я уже сказал

Abdilxamidov 30.06.2011 13:24

Цитата:

Сообщение от kackbip (Сообщение 1007648)
ясно, ну я уже сказал

несколько раз перечитал хелп по Dictionary, честно говоря, - не понял, как его применить. Дайте, пожалуйста, если не затруднит, какой-то пример кода, как его испольовать в моей ситауции.

kackbip 30.06.2011 13:27

Так можно определить ваш словарь.
Код AS3:

var dict:Dictionary = new Dictionary();
 
dict["а"]="a";
dict["б"]="b";
dict["ц"]="ts";

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

КорДум 30.06.2011 13:59

Есть еще регулярные выражения.

gloomyBrain 30.06.2011 14:04

@kacbip
Зачем тут Dictionary? Тут обычного Object вполне себе хватит.
Код AS3:

private static const _latinToCyr:Object = new Object();
private static const _cyrToLatin:Object = new Object();
 
...
 
public function getLatin(cyr:String):String {
 
if (!(cyr in _cyrToLatin)) throw new ArgumentError("Буква не зарегистрирована!");
return _cyrToLatin(cyr) as String;
 
}


Abdilxamidov 30.06.2011 14:37

Цитата:

Сообщение от КорДум (Сообщение 1007656)
Есть еще регулярные выражения.

на каждый символ регулярное выражение составлять или можно чтобы массив искомых символов менялся на массив конечных символов (с соответствием мест символов в массивах конечно)?

kackbip 30.06.2011 14:59

gloomyBrain, да, пожалуй.

wvxvw 30.06.2011 21:36

kackbip: А зачем для этого Dictionary?
Если чесно, я не совсем представляю, как вы будете решать это с помощью регулярных выражений. Еще такой момент: перевод из кириллицы в латиницу не 100% совпадает туда и обратно (т.как количество элементов в алфавитах разное). И вообще, как по мне, то идея граничит с абсурдом... А что будете делать, если файлы будут по-китайски называться?
Есть стандартное решение: escape() или encodeURIComponent() - почитайте про них, выберите то, что больше подходит, и, так, по крайней мере можно однозначно перевести из большего алфавита в меньший и обратно, без потерь по дороге.

КорДум 01.07.2011 01:12

Цитата:

Если чесно, я не совсем представляю, как вы будете решать это с помощью регулярных выражений.
String#replace() же )

DaFive 01.07.2011 10:36

Нашел какой-то жаваскрипт и перевел во флеш.
Код AS3:

var A:Array = new Array();
 
A["Ё"] = "YO"; A["Й"] = "I";  A["Ц"] = "C"; A["У"] = "U"; A["К"] = "K"; A["Е"] = "E"; A["Н"] = "N"; A["Г"] = "G"; A["Ш"] = "SH"; A["Щ"] = "SCH"; A["З"] = "Z"; A["Х"] = "H"; A["Ъ"] = "'";
A["ё"] = "yo"; A["й"] = "i";  A["ц"] = "c"; A["у"] = "u"; A["к"] = "k"; A["е"] = "e"; A["н"] = "n"; A["г"] = "g"; A["ш"] = "sh"; A["щ"] = "sch"; A["з"] = "z"; A["х"] = "h"; A["ъ"] = "'
";
A["Ф"] = "F";  A["Ы"] = "I";  A["В"] = "V"; A["А"] = "A"; A["П"] = "P"; A["Р"] = "R"; A["О"] = "O"; A["Л"] = "L"; A["Д"] = "D"; A["Ж"] = "ZH"; A["Э"] = "E";
A["ф"] = "f";  A["ы"] = "i";  A["в"] = "v"; A["а"] = "a"; A["п"] = "p"; A["р"] = "r"; A["о"] = "o"; A["л"] = "l"; A["д"] = "d"; A["ж"] = "zh"; A["э"] = "e";
A["Я"] = "YA"; A["Ч"] = "CH"; A["С"] = "S"; A["М"] = "M"; A["И"] = "I"; A["Т"] = "T"; A["Ь"] = "'"; A["Б"] = "B"; A["Ю"] = "YU";
A["я"] = "ya"; A["ч"] = "ch"; A["с"] = "s"; A["м"] = "m"; A["и"] = "i"; A["т"] = "t"; A["ь"] = "'
"; A["б"] = "b"; A["ю"] = "yu";
 
var txt:String = 'ту транслит';
 
txt = txt.replace(/([\u0410-\u0451])/g,
function (str, p1, offset, s)
{
      if (A[str] != 'undefined'){return A[str];}
}
);
 
trace(txt);


wvxvw 01.07.2011 11:34

И как вы за один проход замените регулярным выражением 32 разных элемента набором из 25-и разных элементов? Я не говорю, что это невозможно, но это крайне непродуктивно. Кроме того, а как вы будете заменять твердый знак, например?
Но самый главный вопрос это зачем именно транслитерация, когда для задачи она 1. не работает для всего возможного ввода. 2. иногда работает неправильно в оба конца (YO -> Ё | Yo -> Ё, Ё -> YO). 3. даже когда работает правильно, иногда создает строки которые все равно прийдется еще раз перекодировать, если их нужно использовать как имена файлов / пересылать как URI компонент (твердый знак по ГОСТу - #).

DaFive 01.07.2011 11:59

А никто и не говорил, что код работает в обе стороны. Выдан вообще как пример, причем написанный явно давно и непонятно кем.

Abdilxamidov 01.07.2011 15:39

да уж, наверное, лучше вообще грузить на сервер файлы, не сохраняя исходные названия. Присваивать, например, сразу им какие-то цифровые уникальные имена (например отметку времени в млсек) и так уже потом аплодить, а исходные имена можно (если они потом могут понадобиться) отдельно в виде текстового поля в базу прописывать или в соответствующий узел xml

MXPain 18.07.2011 19:17

Сорри за оффтоп, вот мне как раз понадобилось по быстрому оттранслитить, воспользовался вариантом gloomyBrain, как самым прекрасным)) может кому пригодится работающая версия:

Код AS3:

private static const _cyrrilic:Object = {а:"a",б:"b",в:"v",г:"g",д:"d",е:"e",ё:"yo",ж:"zh",з:"z",и:"i",
                        к:"k",л:"l",м:"m",н:"n",о:"o",п:"p",р:"r",с:"s",т:"t",у:"u",ф:"f",
                        х:"h",ц:"c",ч:"ch",ш:"sh",щ:"sch",ь:"'",ы:"i",ъ:"'",э:"e",ю:"yu",я:"ya"};
 
public static function getLatin(cyr:String):String //передаем строчку
                {
                        var i:uint;
                        var translt:String="";
                        for(i=0;i<cyr.length;i++)
                        {
                                var letter:String = cyr.charAt(i).toLowerCase();
                                if (!letter in _cyrrilic)
                                        throw new ArgumentError("Буква не зарегистрирована!");
                                translt = translt.concat(_cyrrilic[letter]);
                        }
                        return translt as String;
                }

Добавлено через 3 часа 59 минут
Код AS3:

public static function getLatin(cyr:String):String 
                {
                        var i:uint;
                        var translt:String="";
 
                        for(i=0;i<cyr.length;i++)
                        {
                                var letter:String = cyr.charAt(i).toLowerCase();
                                var isWSpace:Boolean = CharacterUtil.isWhitespace(cyr.charCodeAt(i));
                                if(isWSpace)
                                {
                                        translt = translt.concat("_");
                                }
                                else translt = translt.concat(_cyrrilic[letter]);
                                //если кириллические символы из структуры
                                if (!letter in _cyrrilic)
                                        translt = translt.concat(letter);
                        }
 
                        return translt +".png" as String;
                }

а вот для названий файлов

Abdilxamidov 19.07.2011 14:02

спасибо


Часовой пояс GMT +4, время: 11:43.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.