ФИО по-латински.
Добавлено: 28 Ноябрь 2016, 14:02
Нужно на лету преобразовывать фамилию и, может быть, имя, отчество в латиницу. Хранить по-латински в базе не хочется. Ни у кого нет процедурки для этого дела?
Место общения программистов, форум разработчиков БД на Clarion
https://forum.clarionlife.net/
Код: Выделить всё
PROGRAM
MAP
Translit(STRING Str),STRING
END
CODE
MESSAGE(Translit('Пример: транслитерация фамилии - Пупкин Василий Васильевич!'))
Translit PROCEDURE(STRING Str)!,STRING
RusSmall STRING('абвгдеёжзийклмнопрстуфхцчшщыэюяьъ')
EngChars STRING(4),DIM(33)
Result STRING(1024)
Counter SHORT
Spaces SHORT
Position SHORT
CODE
EngChars[1] = 'a'
EngChars[2] = 'b'
EngChars[3] = 'v'
EngChars[4] = 'g'
EngChars[5] = 'd'
EngChars[6] = 'e'
EngChars[7] = 'e'
EngChars[8] = 'zh'
EngChars[9] = 'z'
EngChars[10] = 'i'
EngChars[11] = 'i'
EngChars[12] = 'k'
EngChars[13] = 'l'
EngChars[14] = 'm'
EngChars[15] = 'n'
EngChars[16] = 'o'
EngChars[17] = 'p'
EngChars[18] = 'r'
EngChars[19] = 's'
EngChars[20] = 't'
EngChars[21] = 'u'
EngChars[22] = 'f'
EngChars[23] = 'kh'
EngChars[24] = 'tc'
EngChars[25] = 'ch'
EngChars[26] = 'sh'
EngChars[27] = 'shch'
EngChars[28] = 'y'
EngChars[29] = 'e'
EngChars[30] = 'iu'
EngChars[31] = 'ia'
EngChars[32] = ''
EngChars[33] = ''
LOOP Counter = 1 TO LEN(Str)
IF Str[Counter] = ' '
Spaces += 1
CYCLE
END
Position = INSTRING(LOWER(Str[Counter]),RusSmall,1,1)
IF Position > 0
Result = CLIP(Result) & ALL(' ',Spaces) & CHOOSE(ISUPPER(Str[Counter]), UPPER(EngChars[Position]), EngChars[Position])
ELSE
Result = CLIP(Result) & ALL(' ',Spaces) & Str[Counter]
END
Spaces = 0
END
RETURN Result
Код: Выделить всё
PROGRAM
MAP
Translit(STRING Str),STRING
END
CODE
MESSAGE(Translit('Пример: транслитерация фамилии - Чумак Василий Васильевич!'))
Translit PROCEDURE(STRING Str)!,STRING
RusSmall STRING('абвгдеёжзийклмнопрстуфхцчшщыэюяьъ')
EngChars STRING(4),DIM(33)
Result STRING(1024)
Counter SHORT
Spaces SHORT
Position SHORT
FourChars STRING(4)
CODE
EngChars[1] = 'a'
EngChars[2] = 'b'
EngChars[3] = 'v'
EngChars[4] = 'g'
EngChars[5] = 'd'
EngChars[6] = 'e'
EngChars[7] = 'e'
EngChars[8] = 'zh'
EngChars[9] = 'z'
EngChars[10] = 'i'
EngChars[11] = 'i'
EngChars[12] = 'k'
EngChars[13] = 'l'
EngChars[14] = 'm'
EngChars[15] = 'n'
EngChars[16] = 'o'
EngChars[17] = 'p'
EngChars[18] = 'r'
EngChars[19] = 's'
EngChars[20] = 't'
EngChars[21] = 'u'
EngChars[22] = 'f'
EngChars[23] = 'kh'
EngChars[24] = 'tc'
EngChars[25] = 'ch'
EngChars[26] = 'sh'
EngChars[27] = 'shch'
EngChars[28] = 'y'
EngChars[29] = 'e'
EngChars[30] = 'iu'
EngChars[31] = 'ia'
EngChars[32] = ''
EngChars[33] = ''
LOOP Counter = 1 TO LEN(Str)
IF Str[Counter] = ' '
Spaces += 1
CYCLE
END
Position = INSTRING(LOWER(Str[Counter]),RusSmall,1,1)
IF Position > 0
FourChars = EngChars[Position]
FourChars[1] = UPPER(FourChars[1])
Result = CLIP(Result) & ALL(' ',Spaces) & CHOOSE(ISUPPER(Str[Counter]), FourChars, EngChars[Position])
ELSE
Result = CLIP(Result) & ALL(' ',Spaces) & Str[Counter]
END
Spaces = 0
END
RETURN Result
А я банально не согласен с тем автором. Почему Егор должен писаться как Yegor, а Елена как Yelena? Нужно, действительно, искать правила. Если они вообще существуют. Либо методом проб и ошибок.Дед Пахом писал(а):По ссылке, которую я приводил, есть же разбор сложных случаев - Е,Ё в начале слова или в середине кодируются по-разному, ну и т.д.
И опять дифтонги. Откуда вы их в русском языке выкопали?kreator писал(а): Вот, кстати, хоть какие-то правила - http://transliteration.ru/mvd_1047. Может даже и официоз.