こんにちは。ハンドルネーム「Javaを復習する初心者」です。このサイトはプログラミング言語Javaの復習・学習をするブログです。プログラムの開発・実行はEclipseで行ってます。
スポンサーリンク
お知らせ
  • 参考文献のページ作りました。
  • Amazon.co.jpアソシエイトに参加していますが、参考文献の紹介はもしもアフィリエイトに統一しました。
  • 2016年10月9日からは投稿ペースを落とします。週1回くらいにする予定です。
スポンサーリンク

カタカナを平仮名に変換

こんにちは。「Javaを復習する初心者」です。今回はカタカナを平仮名に変換するということをやりました。

StringにはequalsIgnoreCaseメソッドというメソッドがあります。このメソッドはアルファベットの大文字と小文字を区別せずに、このStringを別のStringと比較します。これの平仮名カタカタ版を作ってみました。その際に必要になるのが、カタカナを平仮名に変換することです。

変換処理

文字コードUTF-16ではほとんどのカタカナを平仮名へ単純に変換することができます。「ヴ」、「ヵ」、「ヶ」は調べた結果、対応する平仮名が内容です。それ以外は文字コードの引き算で平仮名に変換できます。実際の式は単純で、カタカナ「c」に対して、「c-0x0060」をするだけです。16進数で0x0060の分だけ並びがずれているということです。

以下はカタカナを平仮名にするメソッドです。

    private String getHiraFrom(String s) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (0x30A1 <= c && c <= 0x30F3) {
                c -= 0x0060;
            }
            sb.append(c);
        }
        return sb.toString();
    }

引数の文字列に対し、i番目の文字を取り出します。文字コードが0x30A1~0x30F3の場合、0x0060を引きます。文字コード0x30A1は「ァ」、0x30F3は「ン」を表します。平仮名は0x3041~0x3093の範囲にあります。ちょうど差が0x0060になっていますので、引いてます。後はStringBuilderに追加していくだけです。最後にStringBuilderをStringに直したものを返却しています。

上記メソッドとString#compareToを使って、比較メソッドを以下のように定義しました。

    public int compareIgnoreHiraKata(String s1, String s2) {
        return getHiraFrom(s1).compareTo(getHiraFrom(s2));
    }

文字コードとして差がなければ0が返却されます。

テスト

以下、テストコードと結果です。

    public void test() {

        show("あ", "あ");
        show("あ", "ア");
        show("あ", "を");
        show("あ", "ヲ");
        show("いろは", "イロハ");
        show("いロハ", "いロハ");

    }

    public void show(String s1, String s2) {
        System.out.println(
                String.format(
                        "%s, %s: %2d",
                        s1, s2, compareIgnoreHiraKata(s1, s2)));
    }
あ, あ:  0
あ, ア:  0
あ, を: -80
あ, ヲ: -80
いろは, イロハ:  0
いロハ, いロハ:  0

「あ」と「ア」の比較結果が0です。変換ができているということです。