技術系(Tips)
PR

ヘボン式ローマ字を JavaScript・PHP で実装する罠|「オノウエ問題」と回避策

saratogax
記事内に商品プロモーションを含む場合があります

ヘボン式ローマ字変換を Web アプリやプログラムに組み込もうとすると、多くの公開ライブラリ・API が同じ罠で躓きます

その典型例が、「尾上(おのうえ)」さんを onoue ではなく onoe に変換してしまうパターンです。本記事では便宜上、これを「オノウエ問題」と呼ぶことにします。

外務省の「ヘボン式ローマ字綴方表」を見ると一見シンプルですが、長音(「OU」「OO」「UU」)の判定だけは文脈依存で、単純な文字列置換では破綻します。

この記事では、ネット上に公開されている PHP・JavaScript の主要ライブラリ / API を実際に検証し、どこで躓くのか・なぜ躓くのかを開発者視点で整理していきます。

結論を先に書くと、外務省の綴方表に準拠した変換は、最終的に自作で実装しました。実用上の変換結果だけを使いたい方は、先に以下のツールをどうぞ。

あわせて読みたい
名前のローマ字(ヘボン式)変換ツール|パスポート申請用の表記をワンクリックで自動生成
名前のローマ字(ヘボン式)変換ツール|パスポート申請用の表記をワンクリックで自動生成

ヘボン式ローマ字綴方表

外務省のサイトに「ヘボン式ローマ字綴方表」があったので、ややこしそうな条件を一部抜粋します。

撥音:B、M、Pの前の「ん」は、NではなくMで表記します。
例:難波(ナンバ)NAMBA、本間(ホンマ)HOMMA、三瓶(サンペイ)SAMPEI

促音:子音を重ねて表記します。
例:服部(ハットリ)HATTORI、吉川(キッカワ)KIKKAWA
ただし、チ(CHI)、チャ(CHA)、チュ(CHU)、チョ(CHO)音の前には「T」を表記します。
例:発地(ホッチ)HOTCHI、八丁(ハッチョウ)HATCHO

長音:OやUは記入しません。
「ウ」を含む長音「ウウ」の場合(「UU」は表記しません。)
例:日向(ヒュウガ)HYUGA、裕貴(ユウキ)YUKI、優子(ユウコ)YUKO
「オ」を含む長音「オウ」の場合(「OU」は表記しません。)
例:幸太(コウタ)KOTA、洋子(ヨウコ)YOKO、亮子(リョウコ)RYOKO
「オ」を含む長音「オオ」の場合(「OO」は表記しません。)
例:大野(オオノ)ONO、大河内(オオコウチ)OKOCHI、大西(オオニシ)ONISHI
末尾が「オオ」音で、ヨミカタが「オ」の場合(「OO」と表記します。)
例:妹尾(セノオ)SENOO、高藤(タカトオ)TAKATOO、横尾(ヨコオ)YOKOO
末尾が「オウ」音で、ヨミカタが「ウ」の場合(「OU」とは表記しません。)
例:伊藤(イトウ)ITO、高藤(タカトウ)TAKATO、御園生(ミソノウ)MISONO

ヘボン式ローマ字綴方表

特に複雑なのが「ウ」と「オ」の扱い方ですね。

1 文字ずつ目視で確認していけば対応できるのですが、これをプログラムで判別するとなると難しい部分があります。

例えば「尾上(おのうえ)」さんという人がいたとします。

この場合、ヘボン式のローマ字表記に変換すると「onoue」となって欲しいですよね。

しかし途中で「ou」が出てくるため、ここの判断をロジックに含められるかがカギになってきそうです。

PHPでのカタカナ/ひらがなのローマ字変換

少し古い記事になりますが、PHP のサンプルとして「PHPでのカタカナ/ひらがなのローマ字変換」というものがありました。

ヘボン式のアルゴリズムが進化していくわけではないので、古くても機能すれば全然問題ありません。

ということで、「MITライセンス」ですし活用できるか確認してみましょう。

結果、残念ながら「オノウエ」さんが「onoe」さんになってしまいますね・・・。

記事の中でも「オオタ」を「ota」にする代わりに副作用があると書かれていましたので、これが副作用なのでしょう。

人名のローマ字表記を行う時に考えるのは、例えば太田(オオタ)という名前は、Oota/Ōta/Ohta/Otaのどれになるのか、あるいは太郎(タロウ)はTarou/Tarō/Taroのどれかという点ですが、今回の変換ではOta/Taroのような表記に統一します。が、統一すると一言で言っても実際は中々面倒な処理となります。単純に下記のような変換を適用する事でも一応は望む結果を得られますが、望まない副作用のような変換も行ってしまう事が問題となります。

PHPでのカタカナ/ひらがなのローマ字変換

ヘボン式のローマ字を変換するプログラム

Web のフォームから「ひらがな」を入力してもらうなら、フロントエンドで先にローマ字に変換しちゃうのもアリです。

ということで、JavaScript で同様のことをやっているプログラムを見つけました。

こちらは、「ひらがな」から「ローマ字」への変換にも対応しているようです。

以下の注意書きはあったものの、「ウ」や「オ」の変換については特に記載がなかったので期待できそうです。

ここで注意点がひとつあります。このヘボン式変換機はひらがな->ローマ字->ひらがなと変換すると、元どおりにならないことがあります。

果たして変換結果はどうでしょうか。

romeToHiragana(str) 関数がローマ字をひらがなに、 hiraganaToRome(str) 関数がひらがなをローマ字に変換します。

ヘボン式のローマ字を変換するプログラム

結果は PHP のサンプルコードと同じく、「オノウエ」さんが「onoe」さんになってしまいました。

以下で、無条件に「ou」を「o」に変換しているので「u」がなくなってしまいますね。

やはり、この部分は難関なのか。

res = res.replace(/oo/g, 'o' + (SHORYAKU ? '^' : ''))
    .replace(/uu/g, 'u' + (SHORYAKU ? '^' : ''))
    .replace(/ou/g, 'o' + (SHORYAKU ? '^' : ''));

日本語文字変換ライブラリ (javascript)

それならば、GitHub で公開されているプログラムはどうでしょうか。

ちょうど良さげな「日本語文字変換ライブラリ (javascript)」というものが見つかりました。

こちらもフロントエンドで活用できるといいのですが・・・。

全角ひらがなをヘボン式ローマ字で半角英文字に変換します。

日本語文字変換ライブラリ (javascript)

GitHub にオンラインデモサイトへのリンクが張られていたので、そちらのサイトで入力結果を確認してみましょう。

結果、こちらも「オノウエ」さんが「onoe」さんになってしまいます。

もしかして、これが正解なのか?いやいや、そんなハズはない。

Yahooのルビ振りAPI

ソースコードを取り入れてもいいのですが、API サービスを利用しても良さそうです。

1 日のリクエスト数が 1 万回以内であれば Yahoo の「ルビ振り」の API が使えます。
(デベロッパーアカウント単位)

残念ながらこのサービスは終了してしまいました

早速連携してみましたが、「オノウエ」さんは「onoue」になったものの、「オオタ」さんが「ota」ではなく「oota」になってしまいました。

これではヘボン式の条件を満たしてくれません・・・。惜しい。

API 仕様にも「ヘボン式」とは明記されていないので、これは文句を言っても仕方ないので諦めましょう。

ヘボン式変換君

そんな中見つけたのが「ヘボン式変換君」というサイト。

パスポート式対応のヘボン式ローマ字変換機です。複数行のデータも一気に変換が可能です。拙い出来ですがご利用下さい。

ヘボン式変換君

残念ながらソースコードの公開はないのですが、このサイトの変換フォームを使うと思った通りに機能します。

こちらのサイトは「訓令式」にも対応されているそうで、ちょっとした変換が必要になった時は便利ですね。

ただし、以下の条件を満たしていないことに気付きました。

末尾が「オオ」音で、ヨミカタが「オ」の場合(「OO」と表記します。)
例:妹尾(セノオ)SENOO、高藤(タカトオ)TAKATOO、横尾(ヨコオ)YOKOO

サイトに掲載されていたルールを読み返すと、外務省のサイトに書かれているルールそのままではないとのことでした。

この辺はあえて考慮していないようですね。納得です。

長音について ・・・ 母音の重なりを1文字で表記します。「 おお = OH 」表現も可能なようですが、任意表記のようなので変換君では考慮していません。(例: とおる→TORU 、 おおにし→ONISHI )

まとめ: 「オノウエ問題」を回避するには

主要な PHP・JavaScript ライブラリと API を検証してきましたが、結論としてはどれも外務省の綴方表を 100% カバーしていません

特に「ou」「oo」の長音判定は、単純な文字列置換では破綻しやすい部分です。末尾なのか、語中の別音節なのかといった文脈で分岐する必要があり、ここを正しく扱っているライブラリは見つかりませんでした。

そこで、文脈判定を含むロジックを自前で組んで、ヘボン式変換ツールを作りました。外務省のルールに沿った変換結果がほしいだけであれば、こちらをそのまま使うか、ロジック面の参考にしてください。

あわせて読みたい
名前のローマ字(ヘボン式)変換ツール|パスポート申請用の表記をワンクリックで自動生成
名前のローマ字(ヘボン式)変換ツール|パスポート申請用の表記をワンクリックで自動生成

本来この手のローマ字変換は標準ライブラリにあると嬉しい機能ですが、英語圏の言語仕様の事情を考えると、当面は自前で持っておくのが現実解と言えます。

ABOUT ME
saratoga
saratoga
フリーランスエンジニア
仕事にも趣味にも IT を駆使するフリーランスエンジニア。技術的な TIPS や日々の生活の中で深堀りしてみたくなったことを備忘録として残していきます。
記事URLをコピーしました