PHPやJSで「ひらがな」や「カタカナ」をローマ字(ヘボン式)に変換
モダン数秘術のプログラムを作っていたら、名前をローマ字変換する必要が出てきた。
ローマ字は「ヘボン式」ということで、文字の対応表を見ると簡単そうなのですが、備考欄にいくつか複雑な条件が指定されています。
自分で作ろうと思ったけど、この手のプログラムコードはネット上に溢れているだろうということで探してみました。
今回は、これらの条件を満たしたライブラリやサンプルコードを紹介したいと思います。
↓↓↓最終的に自分で作成してみました↓↓↓
ヘボン式ローマ字綴方表
外務省のサイトに「ヘボン式ローマ字綴方表」があったので、ややこしそうな条件を一部抜粋します。
撥音: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 )
まとめ
ということで、自分でローマ字変換のツールを作成してみました。
外務省のサイトに書かれていた条件はすべて満たしていると思いますが、この手のライブラリは標準ライブラリとして搭載されていると嬉しいですが、英語圏の人には関係のない話ですからね・・・。
以外に Ruby の言語にはあったりする?
ユーザにやさしい入力インタフェースは重要なのですが、痒いところに手が届かないともどかしいですね。