• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Транслитерация имен

  • Автор темы Rosna
  • Дата начала
R

Rosna

Доброго дня!

Ищу пример реализации функции по тренслитерации имен.
Нужно имена написанные латинице перевести в имена, написанные кириллицей, но можно и с другими языками.

Встречал кто-нибудь такое? Или может сам реализовывал?
 
M

morpheus

моя очень страрая ф-я

Код:
'	LangID = 0 - русский, 1 - украинский
Function Translit( sRusString As String, LangID As Integer ) As String
Translit = ""

Const sRuAlph$ = {а,б,в,г,д,е,ё,ж,з,и,й,к,л,м,н,о,п,р,с,т,у,ф,х,ц,ч,ш,щ,ъ,ы,ь,э,ю,я}
Const sRu2EnAlph$ = {a,b,v,g,d,e,jo,zh,z,i,j,k,l,m,n,o,p,r,s,t,u,f,h,c,ch,sh,shc,`,y, ,je,y,y}

Const sUaAlph$ = {а,б,в,г,д,е,є,ж,з,и,і,ї,й,к,л,м,н,о,п,р,с,т,у,ф,х,ц,ч,ш,щ,ю,я}
Const sUa2EnAlph$ = {a,b,v,g,d,je,e,zh,z,y,i,ji,j,k,l,m,n,o,p,r,s,t,u,f,h,c,ch,sh,shc,y,y}

If Len( sRusString ) = 0 Then Exit Function
Dim sFrom(0 To 1) As String, sTo(0 To 1) As String
sFrom(0) = sRuAlph
sFrom(1) = sUaAlph
sTo(0) = sRu2EnAlph
sTo(1) = sUa2EnAlph	

Dim aFromLC As Variant, aToLC As Variant
Dim aFromUC As Variant, aToUC As Variant
Dim aTo As String
Dim i As Integer, j As Integer

aFromLC =	Split ( Lcase(sFrom(LangID)), |,| )
aToLC = Split ( Lcase(sTo(LangID)), |,| )
aFromUC =	Split ( Ucase(sFrom(LangID)), |,| )
aToUC = Split ( Ucase(sTo(LangID)), |,| )

aTo = sRusString

For i = 1 To Len(sRusString )			'	для каждого символа строки
For j = 0 To Ubound( aFromLC ) 
If Instr( Lcase( Mid( sRusString, i, 1 ) ) , Lcase( aFromLC(j) ) ) > 0 Then

' если для ниж. регистра
If Instr( Mid(sRusString, i, 1 ) , aFromLC(j) ) > 0 Then 	aTo = Implode( Split( aTo, aFromLC(j) ), aToLC(j) )

' если для верх. регистра
If Instr( Mid(sRusString, i, 1 ) , aFromUC(j) ) > 0 Then aTo = Implode( Split( aTo, aFromUC(j) ), aToUC(j) )

End If
Next
Next

Translit = aTo
End Function
 
R

Rosna

Morpheus, большое спасибо!
Пойду пробовать... :google:
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Как всё сложно. :google:
Упрощенно так:
Код:
a = Split("a b v ...")
b = Split("а б в ...")
result = Replace("vasja", a, b)
Только сочетания типа щ-sch, ш-sh, я-ja и т.п. надо поставить на первое место, чтобы они первыми заменялись.
 
V

vitfil

Объясните мне глупому, с каких это пор кириллица и латиница стали языками?
 
R

Rosna

vitfil, не придирайтесь)
Само собой, что не языки, но так понятнее.
 
R

Rosna

Medevic,

Не выходит так почему-то.
Пишет Type mismath на строчке с Реплейсом :)

Код:
Public Function Translite( sEngString As String ) As String
' 
Dim lstRus As Variant
Dim lstEng As Variant
Dim sRusString As Variant

lstRus = Split("а б в г д")
lstEng = Split("a b v g d")

sRusString = Replace("vasja", lstEng, lstRus)

Translite = "test"

End Function ' Translite
 
R

RAJ

первым параметром тоже должен быть массив(см. help)
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
Ребята, не все так просто.
Простой Replace тут не канает.
Из какой страны автор поста? В какую кириллицу переводить? В России свои порядки транслитерации, в Украине свои так же как и в Белоруссии, я думаю.
В первую очередь надо поднять нормативку по правилам транслитерации для определенной страны.
Например в украинском варианте одна и та же буква в начале и конце слова транслитится по разному.

Вот , вот
Причем смотрю что в украинском варианте есть особые нюансы. Разница в том, что в украинском языке есть и ь и ' (апостроф), и в некоторых случаях, где надо писать ' пишется ь
 
R

Rosna

Я из Минска, но язык русский

Проблема тут не столько в правилах, сколько в том, что переводить нужно именно с киррилицы на латиницу, а не наоборот.
Я сделала с помощью наборов символов 4-х, 3-х 2-х и 1-буквенных. Потом их попеременно на слове применяю.
Правда универсальных правил разработать не получилось. Оказалось, что без словарика с частовстречающимися словами не обойтись.

За основу брала это:


Проблемы имели подобный вид:
Igor - переводится в - Игор
мягкий знак никак не присобачить, так как есть имена типа:
Regnar - которое в кириллице должно выглядеть как - Регнар

Ну вроде работает. :)

Morpheus, спасибо еще раз за помощь!
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 933
609
BIT
177
вот изложу нек. соображения...
хоца сэкономить кол-во строк кода :), за оптимальность я не могу ничего сказать
тем не менее - использовать "стандартную" либу (типа от вендора)
Код:
import com.ibm.icu.text.Transliterator;
/**
* Created by mike on 30.01.15.
*/
public class Translit {
public static void main(String args[]){
String rules = "Ч > Ch; ч > ch ";
Transliterator tempTrans = Transliterator.createFromRules("temp", rules, Transliterator.FORWARD);
String tempResult = tempTrans.transform(args[0]);
Transliterator t=Transliterator.getInstance("Any-Latin");
System.out.println(t.transliterate(tempResult));
}
}
юзаем кастомную подстановку и поверх фигачим базовую (с цепочкой я поленился разбираться) com.ibm.icu в поставке нотусни не присут.

Добавлено: rules разумеется надо дополнить
 

alexas1

Green Team
10.04.2014
1 202
225
BIT
34
Проблемы имели подобный вид:
Igor - переводится в - Игор
мягкий знак никак не присобачить, так как есть имена типа:
Regnar - которое в кириллице должно выглядеть как - Регнар
Прямая транслитерация (кир->лат) без проблем - по официальным правилам, как написали выше (с приоритетом дифтонгов).
Обратная - по словарю: взять готовый словарь имён и сделать соответствие им в латинице (автоматом, по официальным правилам).
Если нет в словаре - тогда уж по обратным правилам. Точность будет оч хорошая.
Ну и предусмотреть автоматическое дополнение словаря - пусть система сама себя учит.
На самом деле не так много имён в ходу - примерно 18 000 женских и 22 000 мужских (на всём постсоветском пространстве).

Кста, так можно весьма точно определять пол (по имени, бывает нужно), с проверкой конечно, если имя встретится в "мужском" и "женском" словаре одновременно.
Так же позволит слегка автоматизировать ввод имён, если использовать вместе с моей мулькой.
Если интересно, могу выложить словарики (xlsx) - перегнать в нотус и вперёд.

Так же и с фамилиями можно поступить их тоже не много, как ни странно (у меня словарика нет - потерялся B) )
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 933
609
BIT
177
либа позволяет не весь словарь маньячить в массив, а только сочетания, причем - в наглядной форме (чего - во что)
акцент именно на наглядность и экономию времени составления словаря (поддержки)
этаже либы поддерживает и реверсивное преобразование
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 933
609
BIT
177
маленькая деталь...
в нотусневой поставке (эклипсбэйзед - т.е. полной) есть эти либы находятся они в C:\Program Files\IBM\Notes\framework\rcp\eclipse\plugins
для виндятского 32 разрядного клиента (для 64 бит путь поменяется на ...\Program Files(x86)\... )

в версии 9.0.1 - это com.ibm.icu_3.8.1.v20120530.jar
что, собсно, и можно подключить к архивам (для java агента или либы) - Import->Arhive
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 933
609
BIT
177
и
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!