Текущий архив: 2004.10.24;
Скачать: CL | DM;
ВнизНету ли в природе программы транслитерации русских символов? Найти похожие ветки
← →
Игорь Шевченко © (2004-10-05 16:35) [0]Ищется исходный текст программы транслитерации русских символов в латинские и обратно. Крайне желательно с поддержкой четырех стандартов транслитерации (ГОСТ 16876-71, Library of Congress USA (Library of Congress Slavic (Russian) Transliteration), Princeton University Library"s (Princeton University Library"s Russian Transliteration), Система транслитерации Traveller"s Yellow Pages Transliteration).
Совсем хорошо будет, если еще и поддерживается ГОСТ 7.79-2001.
Хотелось бы, чтобы программа была Freeware :)
← →
Layner © (2004-10-05 16:38) [1]RusCoder&Repair 1.2 beta For Win9x & WinNT Freeware
← →
Layner © (2004-10-05 16:39) [2]А... тут ещё исходнико подавай... тогда не знаю...
← →
KilkennyCat © (2004-10-05 16:42) [3]у меня есть только эти стандарты. Нужны?
← →
1008 © (2004-10-05 16:46) [4]http://delphibase.endimus.com/
← →
Игорь Шевченко © (2004-10-05 16:52) [5]KilkennyCat © (05.10.04 16:42) [3]
Стандарты у меня тоже есть :) Просто я думаю, вдруг велосипед уже изобретен ? :)
1008 © (05.10.04 16:46) [4]
Смотрел, не увидел. Ссылочку поточнее ?
← →
1008 © (2004-10-05 16:56) [6]http://delphibase.endimus.com/?action=viewfunc&topic=strconvert&id=10370
← →
KilkennyCat © (2004-10-05 16:59) [7]а давайте я напишу... к утру готово будет, а то один хрен, мой проект стоит, надо отвлечься...
← →
pasha_golub © (2004-10-05 17:04) [8]Hieroglyph 2.7
← →
Игорь Шевченко © (2004-10-05 17:09) [9]KilkennyCat © (05.10.04 16:59) [7]
Я так только за :)
1008 © (05.10.04 16:56) [6]
Я вообще-то несколько иное имел в виду. Этот топик я видел.
← →
Jeer © (2004-10-05 17:21) [10]Мои студенты это в качестве разминки перед практическими занятиями писали на JScript:)
// Add dict
dict1.add("А","a")
dict1.add("Б","b")
dict1.add("В","v")
dict1.add("Г","g")
dict1.add("Д","d")
dict1.add("Е","e")
dict1.add("Ё","jo")
dict1.add("Ж","zh")
dict1.add("З","z")
← →
Игорь Шевченко © (2004-10-05 17:29) [11]Jeer © (05.10.04 17:21) [10]
Я ж говорил, может, кто уже изобрел велосипед.
← →
}|{yk © (2004-10-05 17:40) [12]Могу дать исходники своего полу-"универсального" перекодировщика (на С++Builder 6), правда С++Builder нету
← →
Игорь Шевченко © (2004-10-05 17:42) [13]}|{yk © (05.10.04 17:40) [12]
Если он поддерживает те стандарты, о которых я писал в самом первом посте, то милости просим. whitefranz@hotmail.com
← →
}|{yk © (2004-10-05 17:46) [14]Нет, он позволяет самому создавать таблицы перекодировки
← →
Игорь Шевченко © (2004-10-05 17:56) [15]}|{yk © (05.10.04 17:46) [14]
Тут задача такая, что при обратной перекодировке нескольким символам исходного текста может соответствовать один символ результата. Твой перекодировщик это умеет ?
← →
Amoeba © (2004-10-05 17:56) [16]Есть готовый перекодировщик - Shtirlitz называется.
http://softsearch.ru/programs/58-697-shtirlitz-download.shtml
← →
Игорь Шевченко © (2004-10-05 17:59) [17]Amoeba © (05.10.04 17:56) [16]
Ищется исходный текст. Для вставки в свою программу.
"Недостатки: 1. идиотская навязчивая реклама в отдельном
всплывающем окне " - оно мне не подходит, спасибо.
← →
}|{yk © (2004-10-05 17:59) [18]Нет, такого не предусматривалось
← →
QuasiLamo © (2004-10-05 19:01) [19]пунтосвинчес кажись чего та там транслитерирует
← →
Igorek © (2004-10-05 20:27) [20]
> Игорь Шевченко © (05.10.04 17:56) [15]
> }|{yk © (05.10.04 17:46) [14]
>
> Тут задача такая, что при обратной перекодировке нескольким
> символам исходного текста может соответствовать один символ
> результата.
А неоднозначностей не может быть?
← →
panov © (2004-10-05 20:34) [21]
function RE(const Src: String): String;
var
i: Integer;
begin
Result := "";
for i := 1 to Length(Src) do
begin
case Src[i] of
"ё": Result := Result + "jo";
"Ё": Result := Result + "JO";
"""": Result := Result + "*";
"А".."я": Result := Result + aR[Ord(Src[i])];
else
Result := Result + Src[i];
end;
end;
end;
function ER(const Src: String): String;
var
i: Integer;
Len: Integer;
begin
Result := "";
Len := Length(Src);
i := 1;
while i<=Len do
begin
case Src[i] of
"a": Result := Result + "а";
"b": Result := Result + "б";
"v": Result := Result + "в";
"g": Result := Result + "г";
"d": Result := Result + "д";
"e":
begin
if (i=Len) or (Src[i+1]<>"h") then
begin
Result := Result + "е";
Inc(i);
Continue;
end;
if Src[i+1]="h" then Result := Result + "э";
Inc(i);
end;
"j":
begin
if (i=Len) or (not (Src[i+1] in ["o","j","u","a"])) then
begin
Result := Result + Src[i];
Inc(i);
Continue;
end;
case Src[i+1] of
"o": Result := Result + "ё";
"j": Result := Result + "й";
"u": Result := Result + "ю";
"a": Result := Result + "я";
end;
Inc(i);
end;
"z":
begin
if (i=Len) or (Src[i+1]<>"h") then
begin
Result := Result + "з";
Inc(i);
Continue;
end;
if Src[i+1]="h" then Result := Result + "ж";
Inc(i);
end;
"i": Result := Result + "и";
"k":
begin
if (i=Len) or (Src[i+1]<>"h") then
begin
Result := Result + "к";
Inc(i);
Continue;
end;
if Src[i+1]="h" then Result := Result + "х";
Inc(i);
end;
"l": Result := Result + "л";
"m": Result := Result + "м";
"n": Result := Result + "н";
"o": Result := Result + "о";
"p": Result := Result + "п";
"r": Result := Result + "р";
"s":
begin
if (i=Len) or (Src[i+1]<>"h") then
begin
Result := Result + "с";
Inc(i);
Continue;
end;
if (i+1=Len) or (Src[i+2]<>"h") then
begin
Result := Result + "ш";
Inc(i,2);
Continue;
end;
if Src[i+2]="h" then
begin
Result := Result + "щ";
end;
Inc(i,2);
end;
"t": Result := Result + "т";
"u": Result := Result + "у";
"f": Result := Result + "ф";
"c":
begin
if (i=Len) or (Src[i+1]<>"h") then
begin
Result := Result + "ц";
Inc(i);
Continue;
end;
if Src[i+1]="h" then Result := Result + "ч";
Inc(i);
end;
""": Result := Result + "ъ";
"y": Result := Result + "ы";
"""": Result := Result + "ь";
"*": Result := Result + """";
"A": Result := Result + "А";
"B": Result := Result + "Б";
"V": Result := Result + "В";
"G": Result := Result + "Г";
"D": Result := Result + "Д";
"E":
begin
if (i=Len) or (Src[i+1]<>"H") then
begin
Result := Result + "Е";
Inc(i);
Continue;
end;
if Src[i+1]="H" then Result := Result + "Э";
Inc(i);
end;
"J":
begin
if (i=Len) or (not (Src[i+1] in ["O","J","U","A"])) then
begin
Result := Result + Src[i];
Inc(i);
Continue;
end;
case Src[i+1] of
"O": Result := Result + "Ё";
"J": Result := Result + "Й";
"U": Result := Result + "Ю";
"A": Result := Result + "Я";
end;
Inc(i);
end;
"Z":
begin
if (i=Len) or (Src[i+1]<>"H") then
begin
Result := Result + "З";
Inc(i);
Continue;
end;
if Src[i+1]="H" then Result := Result + "Ж";
Inc(i);
end;
"I": Result := Result + "И";
"K":
begin
if (i=Len) or (Src[i+1]<>"H") then
begin
Result := Result + "К";
Inc(i);
Continue;
end;
if Src[i+1]="H" then Result := Result + "Х";
Inc(i);
end;
"L": Result := Result + "Л";
"M": Result := Result + "М";
"N": Result := Result + "Н";
"O": Result := Result + "О";
"P": Result := Result + "П";
"R": Result := Result + "Р";
"S":
begin
if (i=Len) or (Src[i+1]<>"H") then
begin
Result := Result + "С";
Inc(i);
Continue;
end;
if (i+1=Len) or (Src[i+2]<>"H") then
begin
Result := Result + "Ш";
Inc(i,2);
Continue;
end;
if Src[i+2]="H" then
begin
Result := Result + "Щ";
end;
Inc(i,2);
end;
"T": Result := Result + "Т";
"U": Result := Result + "У";
"F": Result := Result + "Ф";
"C":
begin
if (i=Len) or (Src[i+1]<>"H") then
begin
Result := Result + "Ц";
Inc(i);
Continue;
end;
if Src[i+1]="H" then Result := Result + "Ч";
Inc(i);
end;
"Y": Result := Result + "Ы";
else
Result := Result + Src[i];
end;
Inc(i);
end;
end;
← →
panov © (2004-10-05 20:35) [22]
const aR:array[$c0..$ff] of String=
(
"A","B","V","G","D","E","ZH","Z",
"I","JJ","K","L","M","N","O","P",
"R","S","T","U","F","KH","C","CH",
"SH","SHH",""","Y","""","EH","JU","JA",
"a","b","v","g","d","e","zh","z",
"i","jj","k","l","m","n","o","p",
"r","s","t","u","f","kh","c","ch",
"sh","shh",""","y","""","eh","ju","ja"
);
← →
Тестировщица © (2004-10-05 22:19) [23]2panov
тогда уж лучше так:
function Translate(const s:string; Flag:boolean=True):string;
type
TArray=array["À".."ÿ"] of string;
const
//GOST 16876-71
LA1:TArray =(
"A","B","V","G","D","E","ZH","Z","I","JJ","K","L",
"M","N","O","P","R","S","T","U","F","KH","C","CH",
"SH","SHH",""","Y","""","EH","JU","JA",
"a","b","v","g","d","e","zh","z","i","jj","k","l",
"m","n","o","p","r","s","t","u","f","kh","c","ch",
"sh","shh",""","y","""","eh","ju","ja");
// GOST 7_79—2001
LA2:TArray =(
"A","B","V","G","D","E","ZH","Z","I","J","K","L",
"M","N","O","P","R","S","T","U","F","X","C","CH",
"SH","SHH","`","Y`","``","E`","YU","YA",
"a","b","v","g","d","e","zh","z","i","j","k","l",
"m","n","o","p","r","s","t","u","f","x","c","ch",
"sh","shh","`","y`","``","e`","yu","ya");
var i,L:integer;
LA:TArray;
begin
if Flag then LA:=LA2 else LA:=LA1;
result:="";
L:=Length(s);
for i:=1 to L do
case s[i] of
"Ё": if Flag then result := result+"YO" else result := result+"JO";
"ё": if Flag then result := result+"yo" else result := result+"jo";
"А".."я": result := result + LA[s[i]];
else result :=result+s[i];
end;
← →
Тестировщица © (2004-10-05 22:21) [24]упс... последний end потерялся -)))
← →
DiamondShark © (2004-10-05 22:44) [25]А можно мне сами стандарты?
← →
Наталия © (2004-10-06 07:54) [26]DiamondShark © (05.10.04 22:44) [25]
Отправила
← →
Danilka © (2004-10-06 10:08) [27]В DMClient есть такая функция на js:
function TranslitDecoder() {
var rus = new Array("Аська","ш", "ч", "Ш", "Ч", "Ш", "Ч", "Я", "я", "к","в","е","р","т","ю","у","и","о","п","л","к","ж","х","г","ф","д","с","а","з","икс","с","в","б","н","м","К","В","Е","Р ","Т","Ю","У","И","О","П","Л","К","Ж","Х","Г","Ф","Д","С","А","З","ИКС","С","В","Б","Н","М","ь");
var tr = new Array("ICQ", "sh","ch","Sh","Ch","SH","CH","Ya","ya","q","w","e","r","t","y","u","i","o","p","l","k","j","h","g","f","d","s","a","z", "x", "c","v","b","n","m","Q","W","E","R","T","Y","U","I","O","P","L","K","J","H","G","F","D","S","A","Z","X", "C","V","B","N","M",""");
if ((document.selection.createRange() != null)&&(document.selection.createRange().text != "")) {
var str = document.selection.createRange().text;
var str2;
for (i=0; i<rus.length; i++) {
str2=str.replace(tr[i],rus[i]);
while (str2 != str) {
str = str2;
str2=str.replace(tr[i],rus[i]);
}
}
document.F1.text.value = document.F1.text.value+str;
} else alert("Не выделен текст!\nСперва выдели текст, который хочешь перевести, затем дави сюда.");
}
:))
Смысл такой - все сочетания символов расставляются в массиве в порядке приоритетов, например, sh стоит первее чем s и h, поэтому сначала будут переведены все такие сочетания, а затем уже отдельные буквы s и h.
Правда, в данном случае, в словаре никаких стандартов нет, писалось на скорую руку и тестировалось на транслите, который Ru писал год назад, когда ему перехотелось на русском писать. :))
← →
Игорь Шевченко © (2004-10-06 10:21) [28]Igorek © (05.10.04 20:27) [20]
> А неоднозначностей не может быть?
Как минимум, один из стандартов (ГОСТ 16876-71) является симметричным. За остальные сказать не могу.
← →
Danilka © (2004-10-06 10:39) [29][28] Игорь Шевченко © (06.10.04 10:21)
Какой объем переводимого текста? Если небольшой, килобайт например, то мой алгоритм нормально отработает, если большой, боюсь, тормоза будут.
А словари можно забить для любого стандарта.
← →
TUser © (2004-10-06 11:04) [30]
> у меня есть только эти стандарты. Нужны?
На самом деле было бы крайне интересно. У меня один только какой-то ГОСТ валяется, а про остальные я первый раз слышу. Дайте ссылку, plz.
← →
DiamondShark © (2004-10-06 11:05) [31]
> Наталия © (06.10.04 07:54) [26]
Спасибо!
← →
Игорь Шевченко © (2004-10-06 11:06) [32]Danilka © (06.10.04 10:39) [29]
> Какой объем переводимого текста?
Для начала - одна фамилия :))
← →
Danilka © (2004-10-06 11:14) [33][32] Игорь Шевченко © (06.10.04 11:06)
Тогда, подойдет вот-этот алгоритм: [27] Danilka © (06.10.04 10:08)
:))
А сделать так чтобы переводил с русского на транслит, достаточно поменять местами массивы в replace. А так, там просто идея, можно сделать как угодно, например, общий кодировщик, на вход которого подается строка и ссылки на два массива, один откуда надо кодировать, другой во что. :))
← →
Игорь Шевченко © (2004-10-06 11:19) [34]Danilka © (06.10.04 11:14) [33]
> Тогда, подойдет вот-этот алгоритм: [27] Danilka © (06.10.04
> 10:08)
К сожалению, ключевым словом является "фамилия". Потому я и искал программу, которая много стандартов поддерживает.
← →
ArMellon © (2004-10-06 11:23) [35]И мне можно тоже сами стандарты , если не трудно скиньте на ArMellon@Rambler.ru
← →
Danilka © (2004-10-06 11:26) [36][34] Игорь Шевченко © (06.10.04 11:19)
Можно тогда мне прислать эти стандарты? Честно говоря, я пока не вижу сложностей - написать свои массивы для каждого из стандартов и все.
← →
Игорь Шевченко © (2004-10-06 11:32) [37]Danilka © (06.10.04 11:26) [36]
http://www.langust.ru/etc/translit.shtml
← →
}|{yk © (2004-10-06 11:33) [38]Тут лучше использовать С++ и STL, там есть понятие пар
← →
Danilka © (2004-10-06 11:43) [39][37] Игорь Шевченко © (06.10.04 11:32)
Спасибо.
Угу, вот-это: "Правила международной транслитерации русских собственных имен" будет проблематично таким способом переводить. Из-за условий, например, е переводить как e или je. В принципе, возможно, но словарь будет большой..
[38] }|{yk © (06.10.04 11:33)
Шутник. :))
← →
Danilka © (2004-10-06 11:47) [40][37] Игорь Шевченко © (06.10.04 11:32)
А для остальных стандартов описать словари легко.
Кроме того, "Правила международной транслитерации русских собственных имен" не подходит, т.к. там, в ряде случаев, используются не латинские буквы.
Страницы: 1 2 вся ветка
Текущий архив: 2004.10.24;
Скачать: CL | DM;
Память: 0.59 MB
Время: 0.037 c