- import java.util.HashMap;
- import java.util.Map;
- public class Kana2Roma {
- Map m = new HashMap();
- public Kana2Roma() {
- m.put("ア", "A");
- m.put("イ", "I");
- m.put("ウ", "U");
- m.put("エ", "E");
- m.put("オ", "O");
- m.put("カ", "KA");
- m.put("キ", "KI");
- m.put("ク", "KU");
- m.put("ケ", "KE");
- m.put("コ", "KO");
- m.put("サ", "SA");
- m.put("シ", "SHI");
- m.put("ス", "SU");
- m.put("セ", "SE");
- m.put("ソ", "SO");
- m.put("タ", "TA");
- m.put("チ", "CHI");
- m.put("ツ", "TU");
- m.put("テ", "TE");
- m.put("ト", "TO");
- m.put("ナ", "NA");
- m.put("ニ", "NI");
- m.put("ヌ", "NU");
- m.put("ネ", "NE");
- m.put("ノ", "NO");
- m.put("ハ", "HA");
- m.put("ヒ", "HI");
- m.put("フ", "FU");
- m.put("ヘ", "HE");
- m.put("ホ", "HO");
- m.put("マ", "MA");
- m.put("ミ", "MI");
- m.put("ム", "MU");
- m.put("メ", "ME");
- m.put("モ", "MO");
- m.put("ヤ", "YA");
- m.put("ユ", "YU");
- m.put("ヨ", "YO");
- m.put("ラ", "RA");
- m.put("リ", "RI");
- m.put("ル", "RU");
- m.put("レ", "RE");
- m.put("ロ", "RO");
- m.put("ワ", "WA");
- m.put("ヲ", "WO");
- m.put("ン", "N");
- m.put("ガ", "GA");
- m.put("ギ", "GI");
- m.put("グ", "GU");
- m.put("ゲ", "GE");
- m.put("ゴ", "GO");
- m.put("ザ", "ZA");
- m.put("ジ", "ZI");
- m.put("ズ", "ZU");
- m.put("ゼ", "ZE");
- m.put("ゾ", "ZO");
- m.put("ダ", "DA");
- m.put("ヂ", "DI");
- m.put("ヅ", "DU");
- m.put("デ", "DE");
- m.put("ド", "DO");
- m.put("バ", "BA");
- m.put("ビ", "BI");
- m.put("ブ", "BU");
- m.put("ベ", "BE");
- m.put("ボ", "BO");
- m.put("パ", "PA");
- m.put("ピ", "PI");
- m.put("プ", "PU");
- m.put("ペ", "PE");
- m.put("ポ", "PO");
- m.put("キャ", "KYA");
- m.put("キュ", "KYU");
- m.put("キョ", "KYO");
- m.put("シャ", "SYA");
- m.put("シュ", "SYU");
- m.put("ショ", "SYO");
- m.put("チャ", "TYA");
- m.put("チュ", "TYU");
- m.put("チョ", "TYO");
- m.put("ニャ", "NYA");
- m.put("ニュ", "NYU");
- m.put("ニョ", "NYO");
- m.put("ヒャ", "HYA");
- m.put("ヒュ", "HYU");
- m.put("ヒョ", "HYO");
- m.put("リャ", "RYA");
- m.put("リュ", "RYU");
- m.put("リョ", "RYO");
- m.put("ギャ", "GYA");
- m.put("ギュ", "GYU");
- m.put("ギョ", "GYO");
- m.put("ジャ", "ZYA");
- m.put("ジュ", "ZYU");
- m.put("ジョ", "ZYO");
- m.put("ヂャ", "DYA");
- m.put("ヂュ", "DYU");
- m.put("ヂョ", "DYO");
- m.put("ビャ", "BYA");
- m.put("ビュ", "BYU");
- m.put("ビョ", "BYO");
- m.put("ピャ", "PYA");
- m.put("ピュ", "PYU");
- m.put("ピョ", "PYO");
- m.put("ー", "-");
- }
- public String kana2roma(String s) {
- StringBuilder t = new StringBuilder();
- for ( int i = 0; i < s.length(); i++ ) {
- if ( i <= s.length() - 2 ) {
- if ( m.containsKey(s.substring(i,i+2))) {
- t.append(m.get(s.substring(i, i+2)));
- i++;
- } else if (m.containsKey(s.substring(i, i+1))) {
- t.append(m.get(s.substring(i, i+1)));
- } else if ( s.charAt(i) == 'ッ' ) {
- t.append(m.get(s.substring(i+1, i+2)).charAt(0));
- } else {
- t.append(s.charAt(i));
- }
- } else {
- if (m.containsKey(s.substring(i, i+1))) {
- t.append(m.get(s.substring(i, i+1)));
- } else {
- t.append(s.charAt(i));
- }
- }
- }
- return t.toString();
- }
- public static void main(String[] args) {
- Kana2Roma k2r = new Kana2Roma();
- String[] strs =
- {"ピュートフクジャガー",
- "マージャン",
- "タンヤオトイトイドラドラ",
- "キップ",
- "プリキュア",
- "シャーペン",
- "カプッ",
- "@マーク",
- "ティーカップ",
- "トッツィ"};
- int num = 1;
- for (String s : strs) {
- System.out.println(String.format("%1$2d", num++) +
- " : " + s + "→" + k2r.kana2roma(s));
- }
-
- }
- }
|
このサンプルでは、マップを使って変換処理を行っています。マップはキーと値と言う組み合わせで登録を行います。
値を取り出すときは、キーを指定して取り出します。
例えば上記サンプルの9行目だとカタカナの「ア」がキーで英字の「A」が値となります。
サンプルでは、カタカナをキー、対応するローマ字を値として登録しています。(9行目〜113行目)
変換処理は、kana2romaメソッドで行っています。
変換対象の文字列から2文字または、1文字ずつ取り出してマップのキーに対応するローマ字に変換しています。
マップ上のキーで2文字で構成されているもの(例えば「キャ」など)を先に変換しています。
これは、1文字構成のキーと2文字構成のキーとで1文字目が同じ場合(例えば「キャ」と「キ」)先に1文字構成のキーから変換すると後続の文字によって多数の振り分け処理を行ったり、
変換した文字を何文字か消して新たな文字を作るような処理を行わなければならないため処理が煩雑になるためです。
例えば先の「キャ」の場合、「キ」の後ろが「ャ」、「ュ」、「ョ」のそれぞれで処理を振り分けることになります。
それにこのケースは、「キ」だけでなく「シ」、「チ」…などの場合があり、かなりの振り分け処理が必要になってきます。
振り分けたたうえでさらに変換済みの文字列を数文字消して振り分けに応じたローマ字に変換するという複雑な処理となってしまいます。
。。と言うわけでまず2文字取り出してマップ上にキーが存在しているか判定した上で、変換処理を行っています。
2文字分のキーが存在しない場合、1文字のキーで判定と変換を行います。
例外的な処理としては、詰まる音「キップ」の「ッ」などです。
この場合は、取り出した文字が「ッ」だった場合、次の文字をローマ字変換した後、最初の1文字目を取り出しています。
「キップ」の場合、「ップ」の部分が「PPU」に変換されます。
変換処理は、1文字ずつ行いStringBuilderオブジェクトに変換した文字をつなげていきます。
全部の文字を変換し終わったら変換後の文字列が全て連結された文字列を返します。