読者です 読者をやめる 読者になる 読者になる

Ruby で平仮名またはカタカナをローマ字にする

ちょうどいいRubyのライブラリがないか調べたので備忘録。 昔はSuikyoというライブラリがあったはずだけど、今はメンテされていない様子。

ローマ字表記について

そもそも論として、いわゆるヘボン式訓令式という2大派閥(?)に加えて外務省方式、駅名方式などかなりのバリエーションがある。ヘボン式についても、オリジナル版(Traditional Hepburn)と改訂版(Revised Hepburn)修正ヘボン式(Modified Hepburn)、日本人による改良版などの亜種があるらしい。

ヘボン式にすべきか訓令式にすべきかという議論はあるようですが、ソフトウェア開発者としてはユーザー次第としか言いようがない。 個人的には人名についてはヘボン式の方が字面がきれいに見えるので良いと思いますが。

参考:ローマ字 - Wikipedia

その2:Hepburn romanization - Wikipedia, the free encyclopedia

とりあえずヘボン式訓令式か、長音をどう扱うかをメインにirbで試した結果。

Rubyのライブラリ

主な違いは長音をどうするか、入力に平仮名、カタカナの両方を受け付けるかどうかなど。適当に検索した範囲では、以下の3つ。

  • romkan
  • romankana
  • romaji

romkan

平仮名からローマ字に変換およびローマ字から平仮名に変換。長音はハイフン-に変換される。

romkan | RubyGems.org | your community gem host

Ruby/Romkan: a Romaji/Kana conversion library for Ruby

ヘボン式から訓令式への変換用のメソッドto_kunreiがある。

irb(main):001:0> require 'romkan'
=> true
irb(main):002:0> "にほんばし".to_roma
=> "nihonbashi"
irb(main):007:0> "にほんばし".to_roma.to_kunrei
=> "nihonbasi"
irb(main):009:0> "らーめん".to_roma
=> "ra-men"
irb(main):010:0> "おーいにっぽん".to_roma
=> "o-inippon"

最終更新日が2011年でちょっと不安。irbでは問題なく動いている。

romankana

平仮名からローマ字に変換およびローマ字から平仮名に変換。

romankana | RubyGems.org | your community gem host

GitHub - ymrl/romankana

irb(main):004:0> require 'romankana'
=> true
irb(main):005:0> "ニホンバシ".to_roman
=> "nihonbashi"
irb(main):006:0> "ジュンイチ".to_roman
=> "junichi"
irb(main):009:0> "ラーメン".to_roman
=> "raamen"
irb(main):010:0> "おーいにっぽん".to_roman
=> "ooinippon"

長音は直前の母音を重ねるタイプ。下記のようなケースを区別できない。

irb(main):012:0> "さあどうする".to_roman
=> "saadousuru"
irb(main):013:0> "さーどうする".to_roman
=> "saadousuru"

入力文字列がリアル鬼ごっこのような文体でない限り問題にはならないかも知れない。

参考:ローマ字とひらがなを変換する - Ruby Tips!

romaji

平仮名、カタカナからヘボン式ローマ字に。長音はハイフン-に変換される。このライブラリは發音(ん)に対してnmを使い分けるようにになっている。 しかし、nの後ろに母音またはyが来るケースについては考慮されてない。

romaji | RubyGems.org | your community gem host

GitHub - makimoto/romaji: Romaji-Kana transliterator

irb(main):001:0> require "romaji"
=> true
irb(main):002:0> require "romaji/core_ext/string"
=> true
irb(main):003:0> "にほんばし".romaji
=> "nihombashi"
irb(main):004:0> "ニホンバシ".romaji
=> "nihombashi"
irb(main):005:0> "ジュンイチ".romaji
=> "junichi"
irb(main):006:0> "ラーメン".romaji
=> "ra-men"
irb(main):007:0> "おーいにっぽん".romaji
=> "o-inippon"

課題など

romkan以外のライブラリにはnの次に母音(a,i,u,e,o)やyが来た場合にアポストロフィを入れる処理はないように見える。また、訓令式との切り替えはromkanにしかない。

なお、長音を文字の上にマクロン(またはサーカムフレックス)をつけて表記したい場合は後処理で一工夫必要。

漢字仮名交じりの文字列からローマ字化したい場合は、zipangというライブラリもある。

参考:日本語をURL用ローマ字に変換するgem Zipangを作った - Qiita

簡単ですがここまで。