JavaScript
識別子
ローマ字
命名法

プログラマーが知っておくべきローマ字の基礎知識

はじめに

プログラミングにおいてローマ字(表記)の知識が必要になる状況があります。識別子の命名にローマ字を用いるときや、かな文字をローマ字に変換するプログラムを作るときなどです。しかし、今は学校でローマ字をきちんと教えないので、ローマ字を正しく理解している人は極めて少ないのが現状です。そこで、プログラマーが知っておくべきローマ字の基礎知識をまとめました。簡単なサンプルコードもあります。お役立てください。

ningyohime.jpg
こにしまさみ編「NINGYOHIME」教学研究社

ローマ字の概要

ローマ字とは

ローマ字とは日本語を記述する方法の一種で、日本語をABCで書く方法です。または、その方法で書かれた日本語です。「ローマ字」はもともと文字の名前ですが、ここでいうローマ字は「ローマ字書き」「ローマ字書き日本語」の意味です。

ローマ字は日本語の発音を外国人に示す発音記号のようなものではありません。したがって、日本語を知らない外国人がローマ字を見たとき、その意味が分からないのは当然として、それを正しい発音で読むこともできません。ヘボン式で書けば外国人でも正しい発音で読めるだろうと思っている人がいるかもしれませんが、それはあり得ません。

ローマ字の原理

ローマ字は日本語をABCで書いたものですが、もう少し正確に言うと、日本語の音声をABCで書いたものです。世界の言語を考えてみると、ほとんどの言語はことばの音声をそのまま表音文字で書いています。世界ではこれが普通の書き方です。そして、これと同じやり方で日本語を書くのがローマ字です。

よく「飛行機」を hikouki と書いてしまう人がいます。これはローマ字の原理が分かっていないために「ひ」「こ」「う」「き」という文字をABCに変換してしまって起こる間違いです。正しくは「ヒ」「コー」「キ」という音声をABCに変換しなければなりません。この原理を理解していない人が多いようです。

ローマ字の方式

ここではローマ字の方式を3種類だけ説明します。まず、学校の「国語」で教えているローマ字です。訓令式とヘボン式があります。それから、学校の「英語」で教えているローマ字です。これもヘボン式と呼ばれていますが、実は「国語」で教えているヘボン式を少し変形した書き方です。ここでは「英語」で教えているヘボン式を英語式と呼んで区別します。

ことば 訓令式 ヘボン式 英語式
東京 Tôkyô Tōkyō Tokyo
大阪 Ôsaka Ōsaka Osaka
豆腐 tôhu tōfu tofu
納豆 nattô nattō natto
訓令式
日本語を日本語らしく書く目的で作られた方式です。合理的に設計されていて、日本語を書くのに適しています。「国語」の勉強や日本語の研究にも役立ちます。小学校の「国語」で訓令式を中心に教えているのはこれが理由です。
ヘボン式
日本語を英語に似せて書く目的で作られた方式です。英語話者が日本語を読むときのフリガナのようなものです。ヘボン式は英語話者には便利ですが、英語話者だけをえこひいきした書き方になってしまいますから、国際的な場に相応しくありません。日本語を書くのにも適していません。
英語式
ヘボン式から記号を取り除いた書き方で、日本語から英語になったことばを書くために使われます。たとえば、「豆腐」「納豆」は英語になって英語式のつづりで書かれています。ただし、英語式で書かれたことばは元の日本語の正しい発音では読めませんし、英語になっていないことばを英語式で書いても無意味です。

なお、訓令式にはきちんとした定義があるのですが、ヘボン式にはそれがありません。ヘボン式もおおよその書き方は決まっていますが、使われる分野によって細かい相違があります。英語式はヘボン式の変形ですが、これは書き方が一定しています。

ローマ字には「ローマ字のつづり方」という規則があり、通常は訓令式を用いることに決まっています。また、国際標準化機構による ISO 3602 でも基本は訓令式と決まっています。あまり知られていませんが、ローマ字は国内的にも国際的にも訓令式が正式の書き方です。

ローマ字の書き方

直音・拗音

直音と拗音の書き方は簡単で、いわゆるローマ字表にすべてのつづりが書いてあります。ただし、ローマ字表に書いてあるカタカナは文字ではなく音声ですから、気をつけてください。たとえば、「カ」は ka ですが、これは文字の「カ」を ka と書くという意味ではなく、音声の「カ」を ka と書くという意味です。

ことば 訓令式 ヘボン式 英語式
すし susi sushi sushi
お茶 otya ocha ocha
富士 Huzi Fuji Fuji
三日月 mikazuki mikazuki mikazuki

訓令式のローマ字表

直音 拗音
a i u e o
キャ キュ キョ
ka ki ku ke ko kya kyu kyo
シャ シュ ショ
sa si su se so sya syu syo
チャ チュ チョ
ta ti tu te to tya tyu tyo
ニャ ニュ ニョ
na ni nu ne no nya nyu nyo
ヒャ ヒュ ヒョ
ha hi hu he ho hya hyu hyo
ミャ ミュ ミョ
ma mi mu me mo mya myu myo
ya yu yo
リャ リュ リョ
ra ri ru re ro rya ryu ryo
wa o
ギャ ギュ ギョ
ga gi gu ge go gya gyu gyo
ジャ ジュ ジョ
za zi zu ze zo zya zyu zyo
ヂャ ヂュ ヂョ
da zi zu de do zya zyu zyo
ビャ ビュ ビョ
ba bi bu be bo bya byu byo
ピャ ピュ ピョ
pa pi pu pe po pya pyu pyo

ヘボン式と英語式のローマ字表

直音 拗音
a i u e o
キャ キュ キョ
ka ki ku ke ko kya kyu kyo
シャ シュ ショ
sa shi su se so sha shu sho
チャ チュ チョ
ta chi tsu te to cha chu cho
ニャ ニュ ニョ
na ni nu ne no nya nyu nyo
ヒャ ヒュ ヒョ
ha hi fu he ho hya hyu hyo
ミャ ミュ ミョ
ma mi mu me mo mya myu myo
ya yu yo
リャ リュ リョ
ra ri ru re ro rya ryu ryo
wa o
ギャ ギュ ギョ
ga gi gu ge go gya gyu gyo
ジャ ジュ ジョ
za ji zu ze zo ja ju jo
ヂャ ヂュ ヂョ
da ji zu de do ja ju jo
ビャ ビュ ビョ
ba bi bu be bo bya byu byo
ピャ ピュ ピョ
pa pi pu pe po pya pyu pyo

撥音

撥音(はつおん)とは「ん」の音です。撥音は n と書きます。ヘボン式と英語式には例外があり、b, m, p の前の撥音は m にします。ヘボン式は撥音を常に n にする書き方もあります。

撥音の次に母音字または y が続くときは ' を挿入します。ヘボン式はこの記号を - にしますが、 ' にする書き方もあります。英語式はこの記号を省略します。

ことば 訓令式 ヘボン式 英語式
電気 denki denki denki
電波 denpa dempa dempa
恋愛 ren'ai ren-ai renai
本屋 hon'ya hon-ya honya

促音

促音(そくおん)とは「っ」の音です。促音は次の子音字を重ねます。子音字が2文字のときは1文字目だけを重ねます。ヘボン式と英語式には例外があり、次の子音字が ch のときは t を書きます。

通常、単語の中で促音の次に母音が続くことはありません。単語の末尾が促音のときは ' を書きます。英語式はこの記号を省略します。

ことば 訓令式 ヘボン式 英語式
切手 kitte kitte kitte
発車 hassya hassha hassha
一致 itti itchi itchi
うわっ uwa' uwa' uwa

長音

長音(ちょうおん)とは「ー」がつく音です。長音はのばす母音字の上に ^(山形)を乗せます。ヘボン式はこの記号を ¯(マクロン)にしますが、^ にする書き方もあります。英語式はこの記号を省略します。

ことば(読み方) 訓令式 ヘボン式 英語式
太郎(タロー) Tarô Tarō Taro
優香(ユーカ) Yûka Yūka Yuka
お母さん(オカーサン) okâsan okāsan okasan
お父さん(オトーサン) otôsan otōsan otosan
ラーメン(ラーメン) râmen rāmen ramen
ケーキ(ケーキ) kêki kēki keki

オ段の長音のフリガナは「オウ」「オオ」「オー」といろいろですが、読み方はすべて「オー」ですから、ローマ字はすべて同じつづりです。

ことば(読み方) 訓令式 ヘボン式 英語式
王様(オーサマ) ôsama ōsama osama
オオカミ(オーカミ) ôkami ōkami okami
オーロラ(オーロラ) ôrora ōrora orora

エ段の長音には例外があります。漢語で音読みのフリガナが「エイ」「ケイ」「セイ」などになる漢字です。実際の音声は「エー」「ケー」「セー」などに近いので長音と考えられますが、長音と見なさずフリガナの通りに ei, kei, sei などと書きます。和語と外来語はそのままです。

ことば(読み方) 訓令式 ヘボン式 英語式
平和(ヘイワ) heiwa heiwa heiwa
生命(セイメイ) seimei seimei seimei
お姉さん(オネーサン) onêsan onēsan onesan
ゲーム(ゲーム) gêmu gēmu gemu

イ段の長音には î, ī を使わないで ii にする書き方もあります。英語式は必ずこの書き方です。

ことば(読み方) 訓令式 ヘボン式 英語式
飯山(イーヤマ) Îyama
Iiyama
Īyama
Iiyama
Iiyama
新潟(ニーガタ) Nîgata
Niigata
Nīgata
Niigata
Niigata
お兄さん(オニーサン) onîsan
oniisan
onīsan
oniisan
oniisan
ビール(ビール) bîru
biiru
bīru
biiru
biiru

特殊音

外来語などで使われる「シェ」「ファ」「ティ」などを特殊音と呼んでいます。昔の日本語には特殊音がなかったので、特殊音の書き方は定義されていません。それでも、おおよその書き方は慣習的に決まっています。

音声 訓令式 ヘボン式, 英語式
シェ sye she
チェ tye che
ジェ zye je
ウォ wo wo
ファ hwa fa
フィ hwi fi
フェ hwe fe
フォ hwo fo
ティ ti, t'i ti
ディ di, d'i di

代用表記

長音の文字(â, î, û など)が使えないときは便宜的な書き方をします。これを代用表記と呼んでいます。いくつか方式があるのですが、ここではひとつだけ説明します。母音字を重ねて書く方式です。

ことば 通常表記 代用表記
お母さん okâsan okaasan
お兄さん onîsan oniisan
宇宙人 utyûzin utyuuzin
お姉さん onêsan oneesan
お父さん otôsan otoosan

この書き方にすると「アー」と「アア」、「オー」と「オオ」などを区別できなくなりますが、これらの音声は似ているので実用レベルでは支障がありません。たとえば、「お父さん」の本当の読み方は「オトーサン」ですが、これを「オトオサン」と読んでも通じます。

厳密には問題があります。たとえば、同じ母音字が3個以上続くと読み方が分からなくなります。それを明らかにするには区切りの記号を挿入しなければなりません。

ことば 通常表記 代用表記
風雨 hûu huuu → huu'u
騒音 sôon sooon → soo'on
好悪 kôo kooo → koo'o
呼応 koô kooo → ko'oo

文章の例

ローマ字の文章を見たことがない人もいると思われますから、実例を示しておきます。昔の小学校で使われていた教科書の1ページです。この話は有島武郎の「僕の帽子のお話」です。
ローマ字の教科書
文部省「ローマ字読本(第一種)KUNI」(小学6年生用)

ローマ字とプログラム

識別子

識別子の命名にローマ字を用いる場合、どの方式のローマ字を採用するかという問題のほかに、長音の文字(â, î, û など)と記号(', -)をどうするかという問題があります。これは次のようにするといいでしょう。

  • ローマ字の方式は訓令式にします。ヘボン式はお勧めしません。英語式はまともに読めないので論外です。
  • 長音の文字は母音字を重ねる代用表記にします。同じ母音字が3個以上連続しても区切りの記号は入れません。
  • 記号は削除します。下線で置き換えてもいいですが、スネークケースの下線と紛らわしくなるので、やめた方がいいでしょう。
意味 ローマ字 命名例
消費税 syôhizei syoohizei
営業外収益 eigyôgai syûeki eigyoogai_syuueki
売上勘定 uriage kanzyô uriage_kanzyoo
長期借入金 tyôki kariirekin tyooki_kariirekin
扶養控除 huyô kôzyo huyoo_koozyo
損益分岐点 son'eki bunkiten soneki_bunkiten

ローマ字のつづりを切り離す規則は「分かち書き」を勉強すると分かります。ここでは詳しく説明できませんが、独立性の高いことば(熟語など)が並んでいたら切り離すと覚えておけばいいでしょう。

ローマ字のソート

ローマ字のテキストデータをソートするときは次のようにします。まず、必要に応じて記号や空白を削除します。次に、長音の文字(â, î, û, ê, ô)を母音字の連続(aa, ii, uu, ee, oo)に置き換えます。それから、通常のソートを行います。こうすると「お兄さん」の書き方が onîsan でも oniisan でも同じ順番になります。大文字と小文字は区別しません。

  1. aaa
  2. aab
  3. âc
  4. Aad
  5. aae

かな文字からローマ字への変換

フリガナをローマ字に変換する

フリガナをローマ字に変換するプログラムは作れません。ローマ字の方式に関係なく、原理的に不可能だからです。ローマ字は日本語の音声をABCで書いたものですが、現代仮名遣いのフリガナでは音声を判定できないことがあり、その場合にローマ字が定まらないからです。

たとえば、フリガナの「コウシ」は読み方が「コウシ」(子牛)なのか「コーシ」(講師)なのか分かりませんから、ローマ字も kousi か kôsi か分かりません。フリガナの「コウ」が長音なのか長音でないのかをプログラムでは判定できないわけです。

インターネットにはフリガナをローマ字に変換すると称するツールがたくさん公開されていますが、いずれも間違った結果を出力することがあります。長音の可能性があるフリガナを長音と決めつけて変換してしまうツールは、「松浦」「井上」「木ノ内」「小梅」「広尾」「豊岡」などを入力すると変換に失敗します。

読み方をローマ字に変換する

読み方をローマ字に変換するプログラムなら簡単に作れます。長音を「ー」で書けば確実に音声が分かるので、簡単な処理でローマ字に変換できます。基本的なアルゴリズムは、ローマ字表の通りに「ア」を a に、「イ」を i に、「ウ」を u に、と置換する処理の繰り返しです。最後に撥音・促音・長音に対応する微調整をします。

読み方を訓令式ローマ字に変換するサンプルプログラムを示します。

/**
 * カタカナ表記の読み方を訓令式ローマ字に変換するサンプル(特殊音には対応していません)
 */
String.prototype.toKunreisiki = function() {

    var s = this;

    return s

        /* 拗音 */
        .replaceA("キャ キュ キョ", "kya kyu kyo")
        .replaceA("シャ シュ ショ", "sya syu syo")
        .replaceA("チャ チュ チョ", "tya tyu tyo")
        .replaceA("ニャ ニュ ニョ", "nya nyu nyo")
        .replaceA("ヒャ ヒュ ヒョ", "hya hyu hyo")
        .replaceA("ミャ ミュ ミョ", "mya myu myo")
        .replaceA("リャ リュ リョ", "rya ryu ryo")
        .replaceA("ギャ ギュ ギョ", "gya gyu gyo")
        .replaceA("ジャ ジュ ジョ", "zya zyu zyo")
        .replaceA("ヂャ ヂュ ヂョ", "zya zyu zyo")
        .replaceA("ビャ ビュ ビョ", "bya byu byo")
        .replaceA("ピャ ピュ ピョ", "pya pyu pyo")

        /* 直音 */
        .replaceA("ア イ ウ エ オ", "a i u e o")
        .replaceA("カ キ ク ケ コ", "ka ki ku ke ko")
        .replaceA("サ シ ス セ ソ", "sa si su se so")
        .replaceA("タ チ ツ テ ト", "ta ti tu te to")
        .replaceA("ナ ニ ヌ ネ ノ", "na ni nu ne no")
        .replaceA("ハ ヒ フ ヘ ホ", "ha hi hu he ho")
        .replaceA("マ ミ ム メ モ", "ma mi mu me mo")
        .replaceA("ヤ ユ ヨ", "ya yu yo")
        .replaceA("ラ リ ル レ ロ", "ra ri ru re ro")
        .replaceA("ワ ヰ ヱ ヲ", "wa i e o")
        .replaceA("ガ ギ グ ゲ ゴ", "ga gi gu ge go")
        .replaceA("ザ ジ ズ ゼ ゾ", "za zi zu ze zo")
        .replaceA("ダ ヂ ヅ デ ド", "da zi zu de do")
        .replaceA("バ ビ ブ ベ ボ", "ba bi bu be bo")
        .replaceA("パ ピ プ ペ ポ", "pa pi pu pe po")

        /* 撥音 */
        .replaceA("ンa ンi ンu ンe ンo ンy", "n'a n'i n'u n'e n'o n'y")
        .replaceA("ン", "n")

        /* 促音 */
        .replaceA("ッk ッs ッt ッn ッh ッm ッy ッr ッw", "kk ss tt nn hh mm yy rr ww")
        .replaceA("ッg ッz ッd ッb ッp", "gg zz dd bb pp")
        .replaceA("ッ", "'")

        /* 長音 */
        .replaceA("aー iー uー eー oー", "â î û ê ô");
};

/**
 * replaceをまとめて行う
 */
String.prototype.replaceA = function(t1, t2) {

    var s = this;
    var u1 = t1.split(/ /);
    var u2 = t2.split(/ /);
    for(var i = 0, n = u1.length; i < n; i++) {
        s = s.replace(new RegExp(u1[i], "g"), u2[i]);
    }
    return s;
}

console.log("ワガハイ ワ ネコ デ アル".toKunreisiki()); //=> wagahai wa neko de aru

おわりに

参考サイト

ローマ字をもっと詳しく知りたい人は「ローマ字 あいうえお」をご利用ください。

:cactus: