Edited at

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

More than 1 year has passed since last update.


はじめに

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

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: