Главная страница
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.72 MB
Время: 0.027 c
1-1097131096
Жбан
2004-10-07 10:38
2004.10.24
Механизм работы Application.Terminate


14-1096568677
Роман
2004-09-30 22:24
2004.10.24
Easu GPRS


4-1095848030
Laymer
2004-09-22 14:13
2004.10.24
Завершения сеанса


4-1095430012
Stefan
2004-09-17 18:06
2004.10.24
ini-файл в памяти


14-1096893983
}|{yk
2004-10-04 16:46
2004.10.24
Кстати, как впечатления от последнего боя Кличко?