Главная страница
    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)
А для остальных стандартов описать словари легко.
Кроме того, "Правила международной транслитерации русских собственных имен" не подходит, т.к. там, в ряде случаев, используются не латинские буквы.


 
Игорь Шевченко ©   (2004-10-06 11:50) [41]

Danilka ©   (06.10.04 11:47) [40]


> "Правила международной транслитерации русских собственных
> имен" не подходит, т.к. там, в ряде случаев, используются
> не латинские буквы.


В загранпаспортах и на авиабилетах (откуда, собственно и задача возникла) используются только латинские буквы


 
Deep ©   (2004-10-06 12:09) [42]


> Игорь Шевченко ©

уж не для мобильных операторов(sms-ок) софт пишеим? :)


 
Суслик ©   (2004-10-06 12:11) [43]


> уж не для мобильных операторов(sms-ок) софт пишеим? :)

ИШ авиатор.


 
Sergey_Masloff   (2004-10-06 12:29) [44]

Игорь Шевченко ©   (06.10.04 11:50) [41]
>В загранпаспортах и на авиабилетах
Не знаю может подойдет... Если учесть что 40% выезжающих за рубеж едут с нашими полисами и случаев заворота от посольств и таможен не припомню - может это подойдет? Обратной задачи не было поэтому только в лат.

function MakeLatin(s :string) :string;
const
rus_a="АБВГДЖЗИКЛМНОПРСТУФХЕЁЫЙЭЪ";
lat_a="ABVGDJZIKLMNOPRSTUFHEEYIEJ";
var
p :string;
n, i :Integer;
begin
p:=AnsiUpperCase(s)+" ";
while TRUE do
 begin
  n:=Pos("Я",p);
  if n>0 then p:=Copy(p,1,n-1)+"YA"+Copy(p,n+1,255) else Break;
 end;
while TRUE do
 begin
  n:=Pos("Ч",p);
  if n>0 then
   if (Copy(p,n-1,1)=" ") or (Copy(p,n+1,1)=" ") or (n=1) then
    p:=Copy(p,1,n-1)+"CH"+Copy(p,n+1,255)
   else
    p:=Copy(p,1,n-1)+"TCH"+Copy(p,n+1,255)
  else Break;
 end;
while TRUE do
 begin
  n:=Pos("Ю",p);
  if n>0 then p:=Copy(p,1,n-1)+"YU"+Copy(p,n+1,255) else Break;
 end;
while TRUE do
 begin
  n:=Pos("Ш",p);
  if n>0 then p:=Copy(p,1,n-1)+"SH"+Copy(p,n+1,255) else Break;
 end;
while TRUE do
 begin
  n:=Pos("Щ",p);
  if n>0 then p:=Copy(p,1,n-1)+"SCH"+Copy(p,n+1,255) else Break;
 end;
while TRUE do
 begin
  n:=Pos("Ц",p);
  if n>0 then p:=Copy(p,1,n-1)+"TS"+Copy(p,n+1,255) else Break;
 end;
while TRUE do
 begin
  n:=Pos("Х",p);
  if n>0 then
   if (Copy(p,n-1,1)<="A") or (n=1) then
    p:=Copy(p,1,n-1)+"H"+Copy(p,n+1,255)
   else
    p:=Copy(p,1,n-1)+"KH"+Copy(p,n+1,255)
  else Break;
 end;
while TRUE do
 begin
  n:=Pos("Ж",p);
  if n>0 then
   if (Copy(p,n-1,1)<="A") or (n=1) then
    p:=Copy(p,1,n-1)+"J"+Copy(p,n+1,255)
   else
    p:=Copy(p,1,n-1)+"ZH"+Copy(p,n+1,255)
  else Break;
 end;
while TRUE do
 begin
  n:=Pos("ИЙ",p);
  if n>0 then p:=Copy(p,1,n-1)+"Y"+Copy(p,n+2,255) else Break;
 end;
while TRUE do
 begin
  n:=Pos("ЫЙ",p);
  if n>0 then p:=Copy(p,1,n-1)+"YI"+Copy(p,n+2,255) else Break;
 end;
i:=1;
while i<=Length(p) do
 begin
  if p[i]="Ь" then begin Delete(p,i,1); Continue; end;
  n:=Pos(p[i],rus_a); if n>0 then p[i]:=lat_a[n];
  i:=i+1;
 end;
Result:=Trim(p);
end;


 
VictorT ©   (2004-10-06 12:31) [45]

Из моего клиента, правда на Си. А передалывал, если не ошибаюсь, из функции, взятой из UBPFD. Т.е. там она должна быть на дельфях. В моём варианте, если не ошибаюсь по Госту.

CString CDeepBrowserDlg::translit(CString str)
{
   CString RArrayL("абвгдеёжзийклмнопрстуфхцчшщьыъэюя");
   CString RArrayU("АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ");
   char arr[][33][5] =
   {{"a","b","v","g","d","e","yo","zh","z","i","j",
     "k","l","m","n","o","p","r","s","t","u","f",
     "h","c","ch","sh","sch",""","y",""","e","yu","ya"},
    {"A","B","V","G","D","E","Yo","Zh","Z","I","J",
     "K","L","M","N","O","P","R","S","T","U","F",
     "H","C","Ch","Sh","Sch",""","Y",""","E","Yu","Ya"}};
   long p;
   char d;
   CString result = "";
   long LenS = str.GetLength();
   for (long i = 0; i < LenS; i++) {
       d = 0;
       p = RArrayL.Find(str.GetAt(i));
       if (p == -1) {
           p = RArrayU.Find(str.GetAt(i));
           d = 1;
       }
       if (p != -1)
           result = result + arr[d][p];
       else
           result = result + str.GetAt(i); //если не русская буква, то берем исходную
   }
   return result;
}


 
Игорь Шевченко ©   (2004-10-06 12:36) [46]

Sergey_Masloff   (06.10.04 12:29) [44]

Сергей, спасибо, мне преимущественно обратная перекодировка требуется.

VictorT ©   (06.10.04 12:31) [45]

Это не ГОСТ, насколько я могу судить. Кроме того, мне интереснее обратная перекодировка.


 
Danilka ©   (2004-10-06 12:55) [47]

[41] Игорь Шевченко ©   (06.10.04 11:50)
Тогда, скорее всего, используется что-то другое, например, ГОСТ или ИСО.
А как на билетах пишут Евгений? На водительских правах пишут EVGENY, хотя по тем правилам должны писать JEVGENIY.
Если используется ГОСТ или ИСО, то мой алгоритм подойдет запросто.


 
Igorek ©   (2004-10-06 12:56) [48]

> Игорь Шевченко ©   (06.10.04 10:21) [28]
> Igorek ©   (05.10.04 20:27) [20]
> > А неоднозначностей не может быть?
> Как минимум, один из стандартов (ГОСТ 16876-71) является
> симметричным. За остальные сказать не могу.

Это вроде не одно и то-же. Однозначным может быть как симметричный, так и не симметричный.


 
[lamer]Barmaglot ©   (2004-10-06 13:16) [49]

Хм... Вообщето Koi8-r при отрезании старшего бита начинает писать транслитом... Кроме того в линукс есть программа iconv насколько я помню, поддерживаемые ей кодировки занимают несколько экранов, кроме того исходные тексты естественно присутствуют :-)... Так что вам прямая дорога в линукс :-)


 
Игорь Шевченко ©   (2004-10-06 13:18) [50]

Igorek ©   (06.10.04 12:56) [48]


> Это вроде не одно и то-же. Однозначным может быть как симметричный,
> так и не симметричный.


С этого места подробнее.


 
Anatoly Podgoretsky ©   (2004-10-06 13:32) [51]

Igorek ©   (06.10.04 12:56) [48]
Не может быть симметричным, где из одного символа получается несколько.


 
}|{yk ©   (2004-10-06 13:34) [52]

Почему не может? Может. Ведь мы же можем как-то различить, где это два разных звука, а где один. Значит есть какие-то правила. Но тут нужно к филологам обращаться


 
Anatoly Podgoretsky ©   (2004-10-06 13:38) [53]

ИИ


 
TUser ©   (2004-10-06 13:43) [54]


> Не может быть симметричным, где из одного символа получается
> несколько

Не всегда, наверное. Обычно бывает спец. символ, который трактуется как начало (конец) комбинации, типа "/". В приведенной ссылке, в одном из вариантов рекомендуют h использовать в качестве суффикса для комбинайий символов - тогда там все будет симметрично.


 
Igorek ©   (2004-10-06 16:08) [55]

> Игорь Шевченко ©   (06.10.04 13:18) [50]
> Igorek ©   (06.10.04 12:56) [48]
> > Это вроде не одно и то-же. Однозначным может быть как
> симметричный, так и не симметричный.
> С этого места подробнее.

Напр. допустим символы [ab]-рус, [cd]-лат.

Тогда преобразование (a->c, b->c) однозначно, но не симметрично (не существует обратного преобразования).

А (a->c, ab->c) - неоднозначно (если нету приоритетов).

Не могу счас сказать точно, в какой взаимосвязи состоят не/однозначность и симметричность в общем случае.

---
Не советую применять алгоритмы на основе FindSubString. Лучше парсить строку посимвольно - конечный автомат для лексического анализа.


 
}|{yk ©   (2004-10-06 16:11) [56]

Эт точно. Дж. Бакнелл, гл.11


 
Igorek ©   (2004-10-06 16:34) [57]


> }|{yk ©   (06.10.04 16:11) [56]
> Эт точно. Дж. Бакнелл, гл.11

Чо за книга?


 
}|{yk ©   (2004-10-06 16:40) [58]

Фундаментальные алгоритмы и структуры данных в Delphi

Но всё-таки, как удобно в С++
typedef std::map<String, String> AlphabetMap;


 
Igorek ©   (2004-10-06 17:24) [59]


> }|{yk ©   (06.10.04 16:40) [58]
> Но всё-таки, как удобно в С++
> typedef std::map<String, String> AlphabetMap;

Что именно? Шаблоны вообще или map в частности?


 
}|{yk ©   (2004-10-06 17:27) [60]

Да вообще STL. Вот бы кто перенес её на Obj Pascal :(


 
Игорь Шевченко ©   (2004-10-06 17:34) [61]


> Да вообще STL. Вот бы кто перенес её на Obj Pascal


С написанием компилятора, поддерживающего templates...


 
Igorek ©   (2004-10-06 17:43) [62]

> }|{yk ©   (06.10.04 17:27) [60]
> Игорь Шевченко ©   (06.10.04 17:34) [61]

Не так и фантастично.
Можно сделать подобное на интерфейсах или на published методах.


 
Игорь Шевченко ©   (2004-10-06 17:44) [63]

Igorek ©   (06.10.04 17:43) [62]


> Не так и фантастично.
> Можно сделать подобное на интерфейсах или на published методах


Сделай. :)


 
Igorek ©   (2004-10-06 17:46) [64]

> на published методах.
Вот только проверка конкретизации шаблонного типа уже на стадии компиляции становится невозможной.


 
Суслик ©   (2004-10-06 17:46) [65]


> 62] Igorek ©   (06.10.04 17:43)


> Можно сделать подобное на интерфейсах или на published методах.

нужно ли только кому-то это подобное?


 
Igorek ©   (2004-10-06 17:47) [66]


> Игорь Шевченко ©   (06.10.04 17:44) [63]
> Igorek ©   (06.10.04 17:43) [62]
> > Не так и фантастично.
> > Можно сделать подобное на интерфейсах или на published
> методах
> Сделай. :)

Деньги в нашем жестоком мире решают все. :-(


 
Игорь Шевченко ©   (2004-10-06 17:49) [67]

Igorek ©   (06.10.04 17:47) [66]


> Деньги в нашем жестоком мире решают все. :-(


А ты начни. Задаром. Набросай идею реализации, глядишь, народ подтянется - у нас народ отзывчивый.


 
wisekaa ©   (2004-10-06 19:44) [68]


> Игорь Шевченко ©

Не ужели во всех просторах интернета не нашлось подходящего алгоритма?


 
KilkennyCat ©   (2004-10-06 20:02) [69]

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


 
}|{yk ©   (2004-10-06 20:04) [70]

Что-то медленно :)


 
KilkennyCat ©   (2004-10-06 20:06) [71]

отвлекают на работе - уже четвертые сутки неспамши, кучу документов готовим-с...


 
Danilka ©   (2004-10-07 09:35) [72]

[55] Igorek ©   (06.10.04 16:08)
> Не советую применять алгоритмы на основе FindSubString.
> Лучше парсить строку посимвольно - конечный автомат для
> лексического анализа.

Угу, если есть необходимость мегабайтные тексты с транслита переводить, а если надо только ФИО, то какие проблемы? :))


 
Anatoly Podgoretsky ©   (2004-10-07 09:53) [73]

Игорь Шевченко ©   (06.10.04 12:36) [46]
Не возможно, только силой интеллекта и в контесте, например посде детранслитеризации получили слово вошод (это простой пример, чаще сложнее), в контексте будет понятно да и то не всегда. Для чатов и форумов это подойдет, а в деле не очень.


 
Игорь Шевченко ©   (2004-10-07 10:02) [74]

Anatoly Podgoretsky ©   (07.10.04 09:53) [73]

Безусловно, интеллект никто не отменяет. Но дать этому интеллекту подспорье, например, в виде возможных вариантов обратной транслитерации, это, я полагаю, решаемая задача.


 
Anatoly Podgoretsky ©   (2004-10-07 10:12) [75]

Игорь Шевченко ©   (07.10.04 10:02) [74]
А подспорье хороше дело, особенно если при этом будет виден оригинал слова и необязательная возможность корректировки.
Программу перекодировки, при наличии таблицы можно написать минут за 30 с отладкой.

При проверке надо учитывать последовательность двойных и тройных символов. Если же добавить грамматический корректор, то качество резко возрастает, это часто используют в OCR

Еще одно неясно для какой цели, если это где то в переписке, чатах, форумах, о встает другая проблема, каждый транслитеризует как бог на душу положит, и очень редко по ГОСТу.


 
Игорь Шевченко ©   (2004-10-07 10:35) [76]

Anatoly Podgoretsky ©   (07.10.04 10:12) [75]


> Еще одно неясно для какой цели


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


 
Igorek ©   (2004-10-07 10:42) [77]

> Anatoly Podgoretsky ©   (07.10.04 10:12) [75]
> каждый транслитеризует
> как бог на душу положит, и очень редко по ГОСТу.

Вот это имхо главная проблема. Транслитерация сама по себе проста. Вопрос в том, что всегда есть оригинал (рус.фамилия). Если вы конвертируете с лат. обратно в рус. то результат гарантирован только если первое преобразование было вам известным.


 
}|{yk ©   (2004-10-07 10:44) [78]

А написать словарь фамилий и искать точное и близкое совпадения?


 
Игорь Шевченко ©   (2004-10-07 10:47) [79]

}|{yk ©   (07.10.04 10:44) [78]

Невыгодно



Страницы: 1 2 вся ветка

Текущий архив: 2004.10.24;
Скачать: CL | DM;

Наверх




Память: 0.71 MB
Время: 0.035 c
4-1095768486
Aleksandr.
2004-09-21 16:08
2004.10.24
Будет ли форма получать и обрабатывать сообщения при ожидании?


4-1095487425
kukuikar
2004-09-18 10:03
2004.10.24
ExtractIcon


14-1096643578
Anatoly Podgoretsky
2004-10-01 19:12
2004.10.24
Слухи о защищенности Оперы и Мозиллы оказались сильно преувеличен


1-1096498695
VlaDD
2004-09-30 02:58
2004.10.24
Как организовать нормальный "рандом"??


3-1096212833
001
2004-09-26 19:33
2004.10.24
TADOTable.Active: "Invalid variant type conversions."





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский