Текущий архив: 2004.10.24;
Скачать: CL | DM;
ВнизНету ли в природе программы транслитерации русских символов? Найти похожие ветки
← →
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.63 MB
Время: 0.037 c