Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.10.24;
Скачать: [xml.tar.bz2];

Вниз

Нету ли в природе программы транслитерации русских символов?   Найти похожие ветки 

 
Игорь Шевченко ©   (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["&#192;".."&#255;"] 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.59 MB
Время: 0.037 c
1-1096554966
Devel
2004-09-30 18:36
2004.10.24
AV при использовании TXMLDocument


14-1096597359
080D:07BBh
2004-10-01 06:22
2004.10.24
Утечки в Java


8-1091007531
Wistler
2004-07-28 13:38
2004.10.24
Как получить изображение с Web-камеры?


3-1096446465
zorik
2004-09-29 12:27
2004.10.24
Округление в Firebird


14-1096708442
Ilya___
2004-10-02 13:14
2004.10.24
Передвижение окна за форму





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский