##はじめに
プログラミングにおいてローマ字(表記)の知識が必要になる状況があります。識別子の命名にローマ字を用いるときや、かな文字をローマ字に変換するプログラムを作るときなどです。しかし、今は学校でローマ字をきちんと教えないので、ローマ字を正しく理解している人は極めて少ないのが現状です。そこで、プログラマーが知っておくべきローマ字の基礎知識をまとめました。簡単なサンプルコードもあります。お役立てください。
##ローマ字の概要
###ローマ字とは
ローマ字とは日本語を記述する方法の一種で、日本語を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 でも同じ順番になります。大文字と小文字は区別しません。
- aaa
- aab
- âc
- Aad
- 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
##おわりに
###参考サイト
ローマ字をもっと詳しく知りたい人は「ローマ字 あいうえお」をご利用ください。