Java

ICU4J を使ってスマートに全角⇔半角カナ変換をする方法 [Java]

この記事で分かること

  • Javaで全角⇔半角のカタカナを相互に変換する方法
  • ICU4J ライブラリを使ったサンプルコード
  • 変換時の注意点について

この記事では、ICU4Jを使ってスマートに全角・半角カナ変換をする方法を紹介します。

主にレガシーなシステムとやり取りをする場合に多いですが、今でも全角カナを半角カナに変換したり、逆に半角カナを全角カナに変換したいケースがたまにあると思います。

全てのカタカナに対応する変換表や連想配列(Map)を自分で作るのも一つの手ですが、どうしても考慮漏れや実装ミスが発生しやすく、出来れば既存のライブラリを使って実装したいですよね?

ICU4Jはその様な場合に使えるオープンソースのライブラリで、詳しい情報は ICU4J - ICU Documentation (unicode-org.github.io) などの公式ドキュメントに記載があります。

mavenの依存関係は、Maven Repository: com.ibm.icu » icu4j (mvnrepository.com) になります。

ゴイチ

それでは、次の章からサンプルコードを使って、具体的な使い方を説明したいと思います。

カナ変換 サンプルコード

全角→半角 カナ変換

全角カナから半角カナは、以下のコードで変換することができます。

Transliterator.getInstance には、"Fullwidth-Halfwidth" を渡してインスタンスを生成します。

副作用として、全角のアルファベットも半角に変換されてしまうので、それで問題ないか確認しておく必要があります。

import com.ibm.icu.text.Transliterator;

public class TransliteratorExample {
    public static String zenkakuToHankaku(String text) {
        Transliterator transliterator = Transliterator.getInstance("Fullwidth-Halfwidth");
        return transliterator.transliterate(text);
    }
}

変換結果

あいうえお -> あいうえお

アイウエオ -> アイウエオ

ヴァイオリン -> ヴァイオリン

abcdefg -> abcdefg

ABCDEFG -> ABCDEFG

漢字 -> 漢字

あいうえおアイウエオヴァイオリンabcdefgABCDEFG漢字 -> あいうえおアイウエオヴァイオリンabcdefgABCDEFG漢字

半角→全角 カナ変換

半角カナから全角カナは、以下のコードで変換することができます。

Transliterator.getInstance には、"Halfwidth-Fullwidth" を渡してインスタンスを生成します。

副作用として、半角のアルファベットも全角に変換されてしまうので、それで問題ないか確認しておく必要があります。

import com.ibm.icu.text.Transliterator;

public class TransliteratorExample {
    public static String hankakuToZenkaku(String text) {
        Transliterator transliterator = Transliterator.getInstance("Halfwidth-Fullwidth");
        return transliterator.transliterate(text);
    }
}

変換結果

あいうえお -> あいうえお

アイウエオ -> アイウエオ

ヴァイオリン -> ヴァイオリン

abcdefg -> abcdefg

ABCDEFG -> ABCDEFG

漢字 -> 漢字

あいうえおアイウエオヴァイオリンabcdefgABCDEFG漢字 -> あいうえおアイウエオヴァイオリンabcdefgABCDEFG漢字

おまけ

Transliterator.getInstanceに渡すことが出来るIDの一覧は、以下のコードで取得することができます。

import com.ibm.icu.text.Transliterator;
import java.util.Collections;
import java.util.List;

public class TransliteratorExample {
    public static List<String> getAvailableIDs() {
        return Collections.list(Transliterator.getAvailableIDs());
    }
}

まとめ

最後に、この記事の内容をまとめます。

要点

  • 全角から半角に変換する場合、"Fullwidth-Halfwidth" を渡してインスタンスを生成する
  • 半角から全角に変換する場合、"Halfwidth-Fullwidth" を渡してインスタンスを生成する
  • getInstanceに指定できるIDは、getAvailableIDs で取得することができる

ICU4Jを使えば、かなり簡単に全角⇔半角の変換をする事が出来ますが、ライブラリの変換ルールが必ずしも皆さんが書いているアプリの仕様と一致しているとは限りませんので、リリース前には入念なテストが必要です。

特に、チルダ、長音、波ダッシュなどは問題が発生しやすいので、気を付けて下さい。

ライブラリの変換がそのまま使えない場合には、変換処理の前後に独自の変換処理を入れる等、柔軟に対応する必要がありそうです。

しかし大抵のケースでは、問題なく便利に利用することができると思いますので、まずはこのライブラリが使えるか試してみるのが良いと思います。

参考になりましたら幸いです。

この記事は役に立ちましたか?

  • この記事を書いた人
アバター画像

ゴイチ

ソフトウェアエンジニア歴20年。 C/C++, C#, Java, Kotlinが得意で、組込系からスマホ、大規模なWebサービスなど幅広いプログラミング経験があります。 現在は某SNSの会社でWebエンジニアをしています。

-Java
-,