среда, 22 апреля 2015 г.

PL/SQL. Транслитерация украинского языка

Моя функция для транслитерации украинского языка в pl/sql.
Правила описаны в законе Украины:
http://zakon4.rada.gov.ua/laws/show/55-2010-п


create or replace function fn_embossing_name(p_name varchar2) return varchar2
/* http://zakon4.rada.gov.ua/laws/show/55-2010-п

                               ТАБЛИЦЯ 
            транслітерації українського алфавіту латиницею 
   

  ------------------------------------------------------------------
  | Український | Латиниця |  Позиція у |    Приклади написання    |
  |   алфавіт   |          |   слові    |--------------------------|
  |             |          |            |українською |  латиницею  |
  |             |          |            |    мовою   |             |
  |-------------+----------+------------+------------+-------------|
  |      Аa     |    Aа    |            |Алушта      |Alushta      |
  |             |          |            |Андрій      |Andrii       |
  |-------------+----------+------------+------------+-------------|
  |      Бб     |    Bb    |            |Борщагівка  |Borshchahivka|
  |             |          |            |Борисенко   |Borysenko    |
  |-------------+----------+------------+------------+-------------|
  |      Вв     |    Vv    |            |Вінниця     |Vinnytsia    |
  |             |          |            |Володимир   |Volodymyr    |
  |-------------+----------+------------+------------+-------------|
  |      Гг     |    Hh    |            |Гадяч       |Hadiach      |
  |             |          |            |Богдан      |Bohdan       |
  |             |          |            |Згурський   |Zghurskyi    |
  |-------------+----------+------------+------------+-------------|
  |      Ґґ     |    Gg    |            |Ґалаґан     |Galagan      |
  |             |          |            |Ґорґани     |Gorgany      |
  |-------------+----------+------------+------------+-------------|
  |      Дд     |    Dd    |            |Донецьк     |Donetsk      |
  |             |          |            |Дмитро      |Dmytro       |
  |-------------+----------+------------+------------+-------------|
  |      Ее     |    Ee    |            |Рівне       |Rivne        |
  |             |          |            |Олег        |Oleh         |
  |             |          |            |Есмань      |Esman        |
  |-------------+----------+------------+------------+-------------|
  |      Єє     |    Ye    | на початку |Єнакієве    |Yenakiieve   |
  |             |          |    слова   |Гаєвич      |Haievych     |
  |             |    ie    |  в інших   |Короп'є     |Koropie      |
  |             |          |  позиціях  |            |             |
  |-------------+----------+------------+------------+-------------|
  |      Жж     |  Zh zh   |            |Житомир     |Zhytomyr     |
  |             |          |            |Жанна       |Zhanna       |
  |             |          |            |Жежелів     |Zhezheliv    |
  |-------------+----------+------------+------------+-------------|
  |      Зз     |    Zz    |            |Закарпаття  |Zakarpattia  |
  |             |          |            |Казимирчук  |Kazymyrchuk  |
  |-------------+----------+------------+------------+-------------|
  |      Ии     |    Yy    |            |Медвин      |Medvyn       |
  |             |          |            |Михайленко  |Mykhailenko  |
  |-------------+----------+------------+------------+-------------|
  |      Іі     |    Ii    |            |Іванків     |Ivankiv      |
  |             |          |            |Іващенко    |Ivashchenko  |
  |-------------+----------+------------+------------+-------------|
  |      Її     |    Yi    | на початку |Їжакевич    |Yizhakevych  |
  |             |          |    слова   |Кадиївка    |Kadyivka     |
  |             |     i    |  в інших   |Мар'їне     |Marine       |
  |             |          |  позиціях  |            |             |
  |-------------+----------+------------+------------+-------------|
  |      Йй     |    Y     | на початку |Йосипівка   |Yosypivka    |
  |             |          |    слова   |Стрий       |Stryi        |
  |             |    i     |  в інших   |Олексій     |Oleksii      |
  |             |          |  позиціях  |            |             |
  |-------------+----------+------------+------------+-------------|
  |      Кк     |    Kk    |            |Київ        |Kyiv         |
  |             |          |            |Коваленко   |Kovalenko    |
  |-------------+----------+------------+------------+-------------|
  |      Лл     |    Ll    |            |Лебедин     |Lebedyn      |
  |             |          |            |Леонід      |Leonid       |
  |-------------+----------+------------+------------+-------------|
  |      Мм     |    Mm    |            |Миколаїв    |Mykolaiv     |
  |             |          |            |Маринич     |Marynych     |
  |-------------+----------+------------+------------+-------------|
  |      Нн     |    Nn    |            |Ніжин       |Nizhyn       |
  |             |          |            |Наталія     |Nataliia     |
  |-------------+----------+------------+------------+-------------|
  |      Оо     |    Oo    |            |Одеса       |Odesa        |
  |             |          |            |Онищенко    |Onyshchenko  |
  |-------------+----------+------------+------------+-------------|
  |      Пп     |    Pp    |            |Полтава     |Poltava      |
  |             |          |            |Петро       |Petro        |
  |-------------+----------+------------+------------+-------------|
  |      Рр     |    Rr    |            |Решетилівка |Reshetylivka |
  |             |          |            |Рибчинський |Rybchynskyi  |
  |-------------+----------+------------+------------+-------------|
  |      Сс     |    Ss    |            |Суми        |Sumy         |
  |             |          |            |Соломія     |Solomiia     |
  |-------------+----------+------------+------------+-------------|
  |      Тт     |    Tt    |            |Тернопіль   |Ternopil     |
  |             |          |            |Троць       |Trots        |
  |-------------+----------+------------+------------+-------------|
  |      Уу     |    Uu    |            |Ужгород     |Uzhhorod     |
  |             |          |            |Уляна       |Uliana       |
  |-------------+----------+------------+------------+-------------|
  |      Фф     |    Ff    |            |Фастів      |Fastiv       |
  |             |          |            |Філіпчук    |Filipchuk    |
  |-------------+----------+------------+------------+-------------|
  |      Хх     |  Kh kh   |            |Харків      |Kharkiv      |
  |             |          |            |Христина    |Khrystyna    |
  |-------------+----------+------------+------------+-------------|
  |      Цц     |  Ts ts   |            |Біла Церква |Bila Tserkva |
  |             |          |            |Стеценко    |Stetsenko    |
  |-------------+----------+------------+------------+-------------|
  |      Чч     |  Ch ch   |            |Чернівці    |Chernivtsi   |
  |             |          |            |Шевченко    |Shevchenko   |
  |-------------+----------+------------+------------+-------------|
  |      Шш     |  Sh sh   |            |Шостка      |Shostka      |
  |             |          |            |Кишеньки    |Kyshenky     |
  |-------------+----------+------------+------------+-------------|
  |      Щщ     |Shch shch |            |Щербухи     |Shcherbukhy  |
  |             |          |            |Гоща        |Hoshcha      |
  |             |          |            |Гаращенко   |Harashchenko |
  |-------------+----------+------------+------------+-------------|
  |      Юю     |    Yu    | на початку |Юрій        |Yurii        |
  |             |          |    слова   |Корюківка   |Koriukivka   |
  |             |    iu    |  в інших   |            |             |
  |             |          |  позиціях  |            |             |
  |-------------+----------+------------+------------+-------------|
  |      Яя     |    Ya    | на початку |Яготин      |Yahotyn      |
  |             |          |    слова   |Ярошенко    |Yaroshenko   |
  |             |    ia    |  в інших   |Костянтин   |Kostiantyn   |
  |             |          |  позиціях  |Знам'янка   |Znamianka    |
  |             |          |            |Феодосія    |Feodosiia    |
  ------------------------------------------------------------------ 

  _______________ 
  Примітка: 1. Буквосполучення "зг" відтворюється латиницею як "zgh" 
               (наприклад,  Згорани - Zghorany, Розгон - Rozghon) на 
               відміну від "zh" -  відповідника  української  літери 
               "ж". 

            2. М'який знак і апостроф латиницею не відтворюються. 

            3. Транслітерація  прізвищ  та  імен осіб і географічних 
               назв здійснюється шляхом  відтворення  кожної  літери 
               латиницею. 

Проверка преобразований по списку из "постановы":
with name_test as ( select 'Алушта' name_1, 'Alushta' name_2 from dual union all
                    select 'Андрій', 'Andrii' from dual union all
                    select 'Борщагівка', 'Borshchahivka' from dual union all
                    select 'Борисенко', 'Borysenko' from dual union all
                    select 'Вінниця', 'Vinnytsia' from dual union all
                    select 'Володимир', 'Volodymyr' from dual union all
                    select 'Гадяч', 'Hadiach' from dual union all
                    select 'Богдан', 'Bohdan' from dual union all
                    select 'Згурський', 'Zghurskyi' from dual union all
                    select 'Ґалаґан', 'Galagan' from dual union all
                    select 'Ґорґани', 'Gorgany' from dual union all
                    select 'Донецьк', 'Donetsk' from dual union all
                    select 'Дмитро', 'Dmytro' from dual union all
                    select 'Рівне', 'Rivne' from dual union all
                    select 'Олег', 'Oleh' from dual union all
                    select 'Есмань', 'Esman' from dual union all
                    select 'Єнакієве', 'Yenakiieve' from dual union all
                    select 'Гаєвич', 'Haievych' from dual union all
                    select 'Короп''є', 'Koropie' from dual union all
                    select 'Житомир', 'Zhytomyr' from dual union all
                    select 'Жанна', 'Zhanna' from dual union all
                    select 'Жежелів', 'Zhezheliv' from dual union all
                    select 'Закарпаття', 'Zakarpattia' from dual union all
                    select 'Казимирчук', 'Kazymyrchuk' from dual union all
                    select 'Медвин', 'Medvyn' from dual union all
                    select 'Михайленко', 'Mykhailenko' from dual union all
                    select 'Іванків', 'Ivankiv' from dual union all
                    select 'Іващенко', 'Ivashchenko' from dual union all
                    select 'Їжакевич', 'Yizhakevych' from dual union all
                    select 'Кадиївка', 'Kadyivka' from dual union all
                    select 'Мар''їне', 'Marine' from dual union all
                    select 'Йосипівка', 'Yosypivka' from dual union all
                    select 'Стрий', 'Stryi' from dual union all
                    select 'Олексій', 'Oleksii' from dual union all
                    select 'Київ', 'Kyiv' from dual union all
                    select 'Коваленко', 'Kovalenko' from dual union all
                    select 'Лебедин', 'Lebedyn' from dual union all
                    select 'Леонід', 'Leonid' from dual union all
                    select 'Миколаїв', 'Mykolaiv' from dual union all
                    select 'Маринич', 'Marynych' from dual union all
                    select 'Ніжин', 'Nizhyn' from dual union all
                    select 'Наталія', 'Nataliia' from dual union all
                    select 'Одеса', 'Odesa' from dual union all
                    select 'Онищенко', 'Onyshchenko' from dual union all
                    select 'Полтава', 'Poltava' from dual union all
                    select 'Петро', 'Petro' from dual union all
                    select 'Решетилівка', 'Reshetylivka' from dual union all
                    select 'Рибчинський', 'Rybchynskyi' from dual union all
                    select 'Суми', 'Sumy' from dual union all
                    select 'Соломія', 'Solomiia' from dual union all
                    select 'Тернопіль', 'Ternopil' from dual union all
                    select 'Троць', 'Trots' from dual union all
                    select 'Ужгород', 'Uzhhorod' from dual union all
                    select 'Уляна', 'Uliana' from dual union all
                    select 'Фастів', 'Fastiv' from dual union all
                    select 'Філіпчук', 'Filipchuk' from dual union all
                    select 'Харків', 'Kharkiv' from dual union all
                    select 'Христина', 'Khrystyna' from dual union all
                    select 'Біла Церква', 'Bila Tserkva' from dual union all
                    select 'Стеценко', 'Stetsenko' from dual union all
                    select 'Чернівці', 'Chernivtsi' from dual union all
                    select 'Шевченко', 'Shevchenko' from dual union all
                    select 'Шостка', 'Shostka' from dual union all
                    select 'Кишеньки', 'Kyshenky' from dual union all
                    select 'Щербухи', 'Shcherbukhy' from dual union all
                    select 'Гоща', 'Hoshcha' from dual union all
                    select 'Гаращенко', 'Harashchenko' from dual union all
                    select 'Юрій', 'Yurii' from dual union all
                    select 'Корюківка', 'Koriukivka' from dual union all
                    select 'Яготин', 'Yahotyn' from dual union all
                    select 'Ярошенко', 'Yaroshenko' from dual union all
                    select 'Костянтин', 'Kostiantyn' from dual union all
                    select 'Знам''янка', 'Znamianka' from dual union all
                    select 'Феодосія', 'Feodosiia' from dual union all
                    select 'Згорани', 'Zghorany' from dual union all
                    select 'Розгон', 'Rozghon' from dual )
select case fn_embossing_name(name_1) 
         when name_2 
         then 'TRUE' 
         else 'FALSE' 
       end status
     , name_1
     , name_2 
  from name_test
*/
is
  m_name varchar2(255);
  m_ukr varchar2(100) := q'[АаБбВвГ㥴ДдЕеЗзИиІіЙйКкЛлМмНнОоПпРрСсТтУуФфїCc -]';
  m_lat varchar2(100) := q'[AaBbVvHhGgDdEeZzYyIiYiKkLlMmNnOoPpRrSsTtUuFfiCc -]';
  m_itm number;
  m_sym varchar2(1);
  m_res varchar2(255);
  m_pos number;
begin
  m_name := lower(p_name);
  m_name := replace(m_name, '`', '');
  m_name := replace(m_name, 'ь', '');
  m_name := replace(m_name, '''', '');
  m_name := replace(m_name, 'зг', 'зґг');
  m_name := replace(m_name, 'я', 'йа');
  m_name := replace(m_name, 'є', 'йе');
  m_name := replace(m_name, 'ю', 'йу');
  m_name := replace(m_name, 'ж', 'зг');
  m_name := replace(m_name, 'х', 'кг');
  m_name := replace(m_name, 'ц', 'тс');
  m_name := replace(m_name, 'щ', 'шч');
  m_name := replace(m_name, 'ч', 'cг');
  m_name := replace(m_name, 'ш', 'сг');
  m_name := initcap(m_name);
  m_name := replace(m_name, 'Ї', 'Иі');
  for m_itm in 1..length(m_name) loop
    m_sym := substr(m_name, m_itm, 1);
    m_pos := instr(m_ukr, m_sym);
    if m_pos > 0 then
      m_res := m_res || substr(m_lat, m_pos, 1);
    else
      m_res := m_res || '?';
    end if;
    dbms_output.put_line(instr(m_ukr, m_sym));
  end loop;
  return m_res;
end;

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

  1. Сервисы кабмина часто не работают.
    Для транслитерации можно использовать например вот такой сервис
    kmu-translite.co.ua

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