お仕事でひらがなをローマ字に変換するプログラムが必要になったのですが、ちょっと調べてみて、うまく利用できそうなやつが意外となかったのでデータベースOracle用として作ってみました。
ご利用は自己責任でどうぞ。
CREATE OR REPLACE FUNCTION HIRA2ROMAN (HIRA IN VARCHAR2)
RETURN VARCHAR2
IS
TYPE tMapping IS RECORD (
hira varchar2(10), roman varchar2(10)
);
TYPE tTable IS TABLE OF tMapping INDEX BY BINARY_INTEGER;
vTable tTable;
REP VARCHAR2(4000);
-- http://www.mext.go.jp/b_menu/hakusho/nc/k19541209001/k19541209001.html
-- 第二表があるものはそちらを優先して、変換対象のひらがなが長い順にならべる
PROCEDURE INIT IS
i NUMBER;
BEGIN
i := 1;
vTable(i).hira := 'きゃ'; vTable(i).roman := 'kya'; i := i + 1; -- 第一表
vTable(i).hira := 'きゅ'; vTable(i).roman := 'kyu'; i := i + 1; -- 第一表
vTable(i).hira := 'きょ'; vTable(i).roman := 'kyo'; i := i + 1; -- 第一表
vTable(i).hira := 'ぎゃ'; vTable(i).roman := 'gya'; i := i + 1; -- 第一表
vTable(i).hira := 'ぎゅ'; vTable(i).roman := 'gyu'; i := i + 1; -- 第一表
vTable(i).hira := 'ぎょ'; vTable(i).roman := 'gyo'; i := i + 1; -- 第一表
vTable(i).hira := 'くぁ'; vTable(i).roman := 'kwa'; i := i + 1; -- 第二表
vTable(i).hira := 'ぐぁ'; vTable(i).roman := 'gwa'; i := i + 1; -- 第二表
vTable(i).hira := 'しゃ'; vTable(i).roman := 'sha'; i := i + 1; -- 第二表
vTable(i).hira := 'しゅ'; vTable(i).roman := 'shu'; i := i + 1; -- 第二表
vTable(i).hira := 'しょ'; vTable(i).roman := 'sho'; i := i + 1; -- 第二表
vTable(i).hira := 'じゃ'; vTable(i).roman := 'ja'; i := i + 1; -- 第二表
vTable(i).hira := 'じゅ'; vTable(i).roman := 'ju'; i := i + 1; -- 第二表
vTable(i).hira := 'じょ'; vTable(i).roman := 'jo'; i := i + 1; -- 第二表
vTable(i).hira := 'ちゃ'; vTable(i).roman := 'cha'; i := i + 1; -- 第二表
vTable(i).hira := 'ちゅ'; vTable(i).roman := 'chu'; i := i + 1; -- 第二表
vTable(i).hira := 'ちょ'; vTable(i).roman := 'cho'; i := i + 1; -- 第二表
vTable(i).hira := 'ぢゃ'; vTable(i).roman := 'dya'; i := i + 1; -- 第二表
vTable(i).hira := 'ぢゅ'; vTable(i).roman := 'dyu'; i := i + 1; -- 第二表
vTable(i).hira := 'ぢょ'; vTable(i).roman := 'dyo'; i := i + 1; -- 第二表
vTable(i).hira := 'にゃ'; vTable(i).roman := 'nya'; i := i + 1; -- 第一表
vTable(i).hira := 'にゅ'; vTable(i).roman := 'nyu'; i := i + 1; -- 第一表
vTable(i).hira := 'にょ'; vTable(i).roman := 'nyo'; i := i + 1; -- 第一表
vTable(i).hira := 'ひゃ'; vTable(i).roman := 'hya'; i := i + 1; -- 第一表
vTable(i).hira := 'ひゅ'; vTable(i).roman := 'hyu'; i := i + 1; -- 第一表
vTable(i).hira := 'ひょ'; vTable(i).roman := 'hyo'; i := i + 1; -- 第一表
vTable(i).hira := 'びゃ'; vTable(i).roman := 'bya'; i := i + 1; -- 第一表
vTable(i).hira := 'びゅ'; vTable(i).roman := 'byu'; i := i + 1; -- 第一表
vTable(i).hira := 'びょ'; vTable(i).roman := 'byo'; i := i + 1; -- 第一表
vTable(i).hira := 'ぴゃ'; vTable(i).roman := 'pya'; i := i + 1; -- 第一表
vTable(i).hira := 'ぴゅ'; vTable(i).roman := 'pyu'; i := i + 1; -- 第一表
vTable(i).hira := 'ぴょ'; vTable(i).roman := 'pyo'; i := i + 1; -- 第一表
vTable(i).hira := 'みゃ'; vTable(i).roman := 'mya'; i := i + 1; -- 第一表
vTable(i).hira := 'みゅ'; vTable(i).roman := 'myu'; i := i + 1; -- 第一表
vTable(i).hira := 'みょ'; vTable(i).roman := 'myo'; i := i + 1; -- 第一表
vTable(i).hira := 'りゃ'; vTable(i).roman := 'rya'; i := i + 1; -- 第一表
vTable(i).hira := 'りゅ'; vTable(i).roman := 'ryu'; i := i + 1; -- 第一表
vTable(i).hira := 'りょ'; vTable(i).roman := 'ryo'; i := i + 1; -- 第一表
vTable(i).hira := 'あ'; vTable(i).roman := 'a'; i := i + 1; -- 第一表
vTable(i).hira := 'い'; vTable(i).roman := 'i'; i := i + 1; -- 第一表
vTable(i).hira := 'う'; vTable(i).roman := 'u'; i := i + 1; -- 第一表
vTable(i).hira := 'え'; vTable(i).roman := 'e'; i := i + 1; -- 第一表
vTable(i).hira := 'お'; vTable(i).roman := 'o'; i := i + 1; -- 第一表
vTable(i).hira := 'か'; vTable(i).roman := 'ka'; i := i + 1; -- 第一表
vTable(i).hira := 'が'; vTable(i).roman := 'ga'; i := i + 1; -- 第一表
vTable(i).hira := 'き'; vTable(i).roman := 'ki'; i := i + 1; -- 第一表
vTable(i).hira := 'ぎ'; vTable(i).roman := 'gi'; i := i + 1; -- 第一表
vTable(i).hira := 'く'; vTable(i).roman := 'ku'; i := i + 1; -- 第一表
vTable(i).hira := 'ぐ'; vTable(i).roman := 'gu'; i := i + 1; -- 第一表
vTable(i).hira := 'け'; vTable(i).roman := 'ke'; i := i + 1; -- 第一表
vTable(i).hira := 'げ'; vTable(i).roman := 'ge'; i := i + 1; -- 第一表
vTable(i).hira := 'こ'; vTable(i).roman := 'ko'; i := i + 1; -- 第一表
vTable(i).hira := 'ご'; vTable(i).roman := 'go'; i := i + 1; -- 第一表
vTable(i).hira := 'さ'; vTable(i).roman := 'sa'; i := i + 1; -- 第一表
vTable(i).hira := 'ざ'; vTable(i).roman := 'za'; i := i + 1; -- 第一表
vTable(i).hira := 'し'; vTable(i).roman := 'shi'; i := i + 1; -- 第二表
vTable(i).hira := 'じ'; vTable(i).roman := 'ji'; i := i + 1; -- 第二表
vTable(i).hira := 'す'; vTable(i).roman := 'su'; i := i + 1; -- 第一表
vTable(i).hira := 'ず'; vTable(i).roman := 'zu'; i := i + 1; -- 第一表
vTable(i).hira := 'せ'; vTable(i).roman := 'se'; i := i + 1; -- 第一表
vTable(i).hira := 'ぜ'; vTable(i).roman := 'ze'; i := i + 1; -- 第一表
vTable(i).hira := 'そ'; vTable(i).roman := 'so'; i := i + 1; -- 第一表
vTable(i).hira := 'ぞ'; vTable(i).roman := 'zo'; i := i + 1; -- 第一表
vTable(i).hira := 'た'; vTable(i).roman := 'ta'; i := i + 1; -- 第一表
vTable(i).hira := 'だ'; vTable(i).roman := 'da'; i := i + 1; -- 第一表
vTable(i).hira := 'ち'; vTable(i).roman := 'chi'; i := i + 1; -- 第二表
vTable(i).hira := 'ぢ'; vTable(i).roman := 'di'; i := i + 1; -- 第二表
vTable(i).hira := 'つ'; vTable(i).roman := 'tsu'; i := i + 1; -- 第二表
vTable(i).hira := 'づ'; vTable(i).roman := 'du'; i := i + 1; -- 第二表
vTable(i).hira := 'て'; vTable(i).roman := 'te'; i := i + 1; -- 第一表
vTable(i).hira := 'で'; vTable(i).roman := 'de'; i := i + 1; -- 第一表
vTable(i).hira := 'と'; vTable(i).roman := 'to'; i := i + 1; -- 第一表
vTable(i).hira := 'ど'; vTable(i).roman := 'do'; i := i + 1; -- 第一表
vTable(i).hira := 'な'; vTable(i).roman := 'na'; i := i + 1; -- 第一表
vTable(i).hira := 'に'; vTable(i).roman := 'ni'; i := i + 1; -- 第一表
vTable(i).hira := 'ぬ'; vTable(i).roman := 'nu'; i := i + 1; -- 第一表
vTable(i).hira := 'ね'; vTable(i).roman := 'ne'; i := i + 1; -- 第一表
vTable(i).hira := 'の'; vTable(i).roman := 'no'; i := i + 1; -- 第一表
vTable(i).hira := 'は'; vTable(i).roman := 'ha'; i := i + 1; -- 第一表
vTable(i).hira := 'ば'; vTable(i).roman := 'ba'; i := i + 1; -- 第一表
vTable(i).hira := 'ぱ'; vTable(i).roman := 'pa'; i := i + 1; -- 第一表
vTable(i).hira := 'ひ'; vTable(i).roman := 'hi'; i := i + 1; -- 第一表
vTable(i).hira := 'び'; vTable(i).roman := 'bi'; i := i + 1; -- 第一表
vTable(i).hira := 'ぴ'; vTable(i).roman := 'pi'; i := i + 1; -- 第一表
vTable(i).hira := 'ふ'; vTable(i).roman := 'fu'; i := i + 1; -- 第二表
vTable(i).hira := 'ぶ'; vTable(i).roman := 'bu'; i := i + 1; -- 第一表
vTable(i).hira := 'ぷ'; vTable(i).roman := 'pu'; i := i + 1; -- 第一表
vTable(i).hira := 'へ'; vTable(i).roman := 'he'; i := i + 1; -- 第一表
vTable(i).hira := 'べ'; vTable(i).roman := 'be'; i := i + 1; -- 第一表
vTable(i).hira := 'ぺ'; vTable(i).roman := 'pe'; i := i + 1; -- 第一表
vTable(i).hira := 'ほ'; vTable(i).roman := 'ho'; i := i + 1; -- 第一表
vTable(i).hira := 'ぼ'; vTable(i).roman := 'bo'; i := i + 1; -- 第一表
vTable(i).hira := 'ぽ'; vTable(i).roman := 'po'; i := i + 1; -- 第一表
vTable(i).hira := 'ま'; vTable(i).roman := 'ma'; i := i + 1; -- 第一表
vTable(i).hira := 'み'; vTable(i).roman := 'mi'; i := i + 1; -- 第一表
vTable(i).hira := 'む'; vTable(i).roman := 'mu'; i := i + 1; -- 第一表
vTable(i).hira := 'め'; vTable(i).roman := 'me'; i := i + 1; -- 第一表
vTable(i).hira := 'も'; vTable(i).roman := 'mo'; i := i + 1; -- 第一表
vTable(i).hira := 'や'; vTable(i).roman := 'ya'; i := i + 1; -- 第一表
vTable(i).hira := 'ゆ'; vTable(i).roman := 'yu'; i := i + 1; -- 第一表
vTable(i).hira := 'よ'; vTable(i).roman := 'yo'; i := i + 1; -- 第一表
vTable(i).hira := 'ら'; vTable(i).roman := 'ra'; i := i + 1; -- 第一表
vTable(i).hira := 'り'; vTable(i).roman := 'ri'; i := i + 1; -- 第一表
vTable(i).hira := 'る'; vTable(i).roman := 'ru'; i := i + 1; -- 第一表
vTable(i).hira := 'れ'; vTable(i).roman := 're'; i := i + 1; -- 第一表
vTable(i).hira := 'ろ'; vTable(i).roman := 'ro'; i := i + 1; -- 第一表
vTable(i).hira := 'わ'; vTable(i).roman := 'wa'; i := i + 1; -- 第一表
vTable(i).hira := 'を'; vTable(i).roman := 'wo'; i := i + 1; -- 第二表
END;
BEGIN
INIT;
REP := HIRA;
FOR i in vTable.FIRST .. vTable.LAST LOOP
REP := REPLACE(REP, vTable(i).hira, vTable(i).roman);
END LOOP;
-- その他の変換ルール
-- yと母音(aeiou)が続く「ん」は、「n'」と続くyまたは母音(aeiou)に変換
REP := REGEXP_REPLACE(REP,'ん([yaeiou])','n''\1');
-- その他の「ん」は「n」に変換
REP := REPLACE(REP,'ん','n');
-- 「っ」は、続く子音の文字を重ねるよう変換
REP := REGEXP_REPLACE(REP,'っ(.)','\1\1');
RETURN REP;
END;
/