Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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["&#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;
Скачать: CL | DM;

Наверх




Память: 0.6 MB
Время: 0.024 c
14-1096962441
NewDelpher
2004-10-05 11:47
2004.10.24
Полет герр Думкопфа


9-1088003860
3d_Vorpos
2004-06-23 19:17
2004.10.24
Проекция на плоскость эксрана точки в пространстве.


14-1096890677
Marker
2004-10-04 15:51
2004.10.24
Можно ли заставить Excel...


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


1-1097330713
zep
2004-10-09 18:05
2004.10.24
image