Страница 1 из 2

ФИО по-латински.

Добавлено: 28 Ноябрь 2016, 14:02
kreator
Нужно на лету преобразовывать фамилию и, может быть, имя, отчество в латиницу. Хранить по-латински в базе не хочется. Ни у кого нет процедурки для этого дела?

ФИО по-латински.

Добавлено: 28 Ноябрь 2016, 14:43
Дед Пахом
Интересный вопрос. Если без затей, то без проблем - поставить каждой русской букве однозначное соответствие. А если например надо "Чехов" преобразовать в "Chekhov"?

ФИО по-латински.

Добавлено: 28 Ноябрь 2016, 17:08
kreator
Как раз с Чеховым проблем нет, однозначное соответствие "ч"-"ch", "х"-"kh". Пугает скорее "й", "ий", "ый". В общем, когда надо обрабатывать несколько русских букв, а звук как бы один. Целая тема. Думал, может кто уже проходил.

ФИО по-латински.

Добавлено: 28 Ноябрь 2016, 17:18
Дед Пахом
Нашёл перспективную страничку, для php, но это не важно https://habrahabr.ru/post/187778/

ФИО по-латински.

Добавлено: 29 Ноябрь 2016, 8:47
Admin
Ну по тупому как то так... на основе документа

Код: Выделить всё

       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

ФИО по-латински.

Добавлено: 29 Ноябрь 2016, 8:48
Admin
ENV файл не забываем... сам забыл и тупил сидел несколько минут :idied:

ФИО по-латински.

Добавлено: 29 Ноябрь 2016, 8:50
Admin
Ага... ну и UPPER у меня жирный :) нужно только первую букву ...

ФИО по-латински.

Добавлено: 29 Ноябрь 2016, 8:52
Admin
Исправил

Код: Выделить всё

       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

ФИО по-латински.

Добавлено: 29 Ноябрь 2016, 13:56
kreator
Принцип ясен. Нужно для начала сделать по-простому. А потом вылавливать необычные фамилии, и для них пытаться найти варианты. Сразу не могу сообразить, что делать с дифтонгами, которых по определению в русском языке нет :D .

ФИО по-латински.

Добавлено: 29 Ноябрь 2016, 14:45
Дед Пахом
По ссылке, которую я приводил, есть же разбор сложных случаев - Е,Ё в начале слова или в середине кодируются по-разному, ну и т.д.

ФИО по-латински.

Добавлено: 29 Ноябрь 2016, 15:11
Admin
Для начала найти актуальную документацию по загран. паспортам.
Подправить и все.
Без разных фантазий...

ФИО по-латински.

Добавлено: 29 Ноябрь 2016, 17:19
kreator
Дед Пахом писал(а):По ссылке, которую я приводил, есть же разбор сложных случаев - Е,Ё в начале слова или в середине кодируются по-разному, ну и т.д.
А я банально не согласен с тем автором. Почему Егор должен писаться как Yegor, а Елена как Yelena? Нужно, действительно, искать правила. Если они вообще существуют. Либо методом проб и ошибок.

ФИО по-латински.

Добавлено: 29 Ноябрь 2016, 17:24
kreator
Вот, кстати, хоть какие-то правила - http://transliteration.ru/mvd_1047. Может даже и официоз.

ФИО по-латински.

Добавлено: 30 Ноябрь 2016, 9:10
Admin
kreator писал(а): Вот, кстати, хоть какие-то правила - http://transliteration.ru/mvd_1047. Может даже и официоз.
И опять дифтонги. Откуда вы их в русском языке выкопали?

ФИО по-латински.

Добавлено: 30 Ноябрь 2016, 9:12
Admin
Дед Пахом писал(а):Е,Ё в начале слова или в середине кодируются по-разному
Кто это решил? :)