ПУСТО

четверг, 18 июня 2015 г.

Функция translit() - перевод русского текста в транслит

На тему транслита есть полезный сайт http://transliteration.ru/. Для начала приведу таблицы транслитерации, затем исходные тексты.

Транслитерация с использованием латинских букв

ГОСТ 16876-71

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

ГОСТ 7.79-2000

Транслитерация имен для загранпаспорта РФ

а a
б b
в v
г g
д d
е e
ё jo
ж 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
ё yo
ж zh
з z
и i, i'
й j
к k
л l
м m
н n
о o
п p
р r
с s
т t
у u
ф f
х x
ц cz, c
ч ch
ш sh
щ shh
ъ ``
ы y'
ь `
э e`
ю yu
я ya
апостров ' '
а a
б b
в v
г g
д d
е ye, e
ё ye, e
ж zh
з z
и i
й y
к k
л l
м m
н n
о o
п p
р r
с s
т t
у u
ф f
х kh
ц ts
ч ch
ш sh
щ shch
ъ ``
ы y
ь `
э e
ю yu
я ya
Так называемые дифтонги — сочетания гласной буквы и «й», отражаются следующим образом:
ай — ay
ей — ey или yey
ий — iy
ой — oy
уй — uy
ый — yy
эй — ey
юй — yuy
ей — yay

Исходный код на PHP
взято тут (и мной  не проверялся)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
  // функция превода текста с кириллицы в траскрипт
  function encodestring($st)
  {
    // Сначала заменяем "односимвольные" фонемы.
    $st=strtr($st,"абвгдеёзийклмнопрстуфхъыэ_",
    "abvgdeeziyklmnoprstufh'iei");
    $st=strtr($st,"АБВГДЕЁЗИЙКЛМНОПРСТУФХЪЫЭ_",
    "ABVGDEEZIYKLMNOPRSTUFH'IEI");
    // Затем - "многосимвольные".
    $st=strtr($st,
                    array(
                        "ж"=>"zh", "ц"=>"ts", "ч"=>"ch", "ш"=>"sh",
                        "щ"=>"shch","ь"=>"", "ю"=>"yu", "я"=>"ya",
                        "Ж"=>"ZH", "Ц"=>"TS", "Ч"=>"CH", "Ш"=>"SH",
                        "Щ"=>"SHCH","Ь"=>"", "Ю"=>"YU", "Я"=>"YA",
                        "ї"=>"i", "Ї"=>"Yi", "є"=>"ie", "Є"=>"Ye"
                        )
             );
    // Возвращаем результат.
    return $st;
  }
?>
Есть еще код на С++ от Баранова,
Ну а ниже мой код на C для ГОСТ 16876-71
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
// Для кодировки Windows-1251 (синоним CP1251)
static unsigned char   tr_rus1[23]={'а','б','в','г','д','е','з','и','к','л','м','н','о','п','р','с','т','у','ф','ц','ъ','ы','ь'};
static          char   tr_trn1[23]={'a','b','v','g','d','e','z','i','k','l','m','n','o','p','r','s','t','u','f','c','"','y',0x27};
static unsigned char   tr_rus2[10]={'ё', 'ж', 'й', 'х', 'ч', 'ш', 'щ''э', 'ю', 'я'}; //
static char          * tr_trn2[10]={"jo","zh","jj","kh","ch","sh","shh","eh","ju","ja"};
 
void translit(char * pVal, const char * pSrc)
{
  while (*pSrc)
  {
   unsigned char ch=(unsigned char)(*pSrc);
   if (ch & 0x80)
   { // Нужно кодировать
    char * ps;
    int ii,jj;
    unsigned char up=0;
         if (ch==0xA8) {ch=0xB8;up='a'-'A';}
    else if ((ch<0xE0) && (ch!=0xB8))
    {
     ch+=32;up='a'-'A';
    }
    ii=0;
    while (ii<10)
    {    
      if (tr_rus2[ii]==ch)
      {
        ps=tr_trn2[ii];
        while (ps[0])
        {
         *pVal=(*ps)-up;
         ps++;pVal++;
        }
        break;
      }
      ii++;
    }
    if (ii==10)
    {
     ii=0;
     while (ii<23)
     {
       if (tr_rus1[ii]==ch)
       {
        *pVal=tr_trn1[ii]-up;pVal++;break;
       }
       ii++;
     }
     if (ii==23)
     { // Не нашли
      *pVal='?';pVal++;
     }
    }   
   } else
   { // Не нужно кодировать
    *pVal=*pSrc;pVal++;
   }
   pSrc++;
  }
  *pVal=0;
}

1 комментарий:

  1. Harrah's Cherokee Casino & Hotel - JTM Hub
    The Cherokee Valley River 시흥 출장샵 Casino, Hotel & Resort, Cherokee · 대구광역 출장마사지 Harrah's Cherokee Casino & Hotel · 포천 출장안마 Harrah's Cherokee Casino 용인 출장마사지 & Hotel · Harrah's Cherokee Casino 군포 출장안마 & Hotel

    ОтветитьУдалить