Javaの文字変換ライブラリICU4Jを使ってみよう

投稿者 : OSCA

[PR] "出川哲朗の充電させてもらえませんか?"で登場したロケ地を紹介するファンサイト「あの場所へ行こう!」はこちら。

 本稿では、様々な文字変換を行ってくれる Java ライブラリ ICU4J (International Components for Unicode) について解説します。

ICU (International Components for Unicode) の概要

 ICU (International Components for Unicode) は、Unicode の文字の変換を行ってくれるライブラリです。 ここで言う「文字の変換」とは、全角文字を半角に変換したり、逆に半角文字を全角文字にしたり、ひらがなをカタカナに、ひらがなをローマ字に変換したりするようなことです。

 ICU は C言語版とJava版が開発されていますが、そのJava版が本稿で紹介する ICU4J になります。 ここではいくつかのサンプルプログラムを示して ICU4J の利用方法について紹介しますので、その利便性を知っていただければと思います。

ライブラリの入手/導入

 ICU4J は、公式ホームページのダウンロードページからダウンロードすることができます。

 またプロジェクトで Maven を利用していれば、pom.xml に依存関係を追加することで利用することもできます。 現時点での最新のバージョンについてはこちらで確認できますが、pom.xml に追記する記述は以下の通りです。

<dependency>
  <groupId>com.ibm.icu</groupId>
  <artifactId>icu4j</artifactId>
  <version>55.1</version>
</dependency>

サンプルプログラム

 それではさっそく、変換方法の種別ごとにサンプルプログラムを示します。

全角→半角

 まずは全角を半角に変換する方法です。 次のサンプルプログラムのように、半角文字を含む文字列の変換を行ってくれます。

Transliterator transliterator = Transliterator.getInstance("Fullwidth-Halfwidth");
String result = transliterator.transliterate("アイウガギグ123①¥%$");
System.out.println(result);

[結果]
アイウガギグ123①¥%$

 上のサンプルにわざと対応する半角文字がないと思われる「①」という文字を入れてみました。 結果の通り「①」という文字は変換が行われません。 作るシステムで「①」を「(1)」に変換するなどの要件がある場合は、IUJ4Jを利用する前後で自力でやる必要がありそうです。

 また知っておいて頂きたいのは Java 1.6 以降で利用できるようになった java.text.Normalizer クラスの存在です。 java.text.Normalizer クラスを利用すれば、全角英数字であれば半角に変換することができます。 どのような文字種類を変換するのかを気にした上で、ICU4J と Normalizer クラスを使い分けた方が良いでしょう。

半角→全角

 次は半角→全角の変換です。 Transliterator の getInstance の引数を変更しています。

Transliterator transliterator = Transliterator.getInstance("Halfwidth-Fullwidth");
String result = transliterator.transliterate("アイウエオガギグゲゴ");
System.out.println(result);

[結果]
アイウエオガギグゲゴ

カタカナ→ひらがな

 カタカナをひらがなに変換することもできます。 次の例のように、カタカナは全角でも半角のどちらからでも対応しています。

Transliterator transliterator = Transliterator.getInstance("Katakana-Hiragana");
String result = transliterator.transliterate("アイウエオガギグゲゴ アイウエオガギグゲゴ");
System.out.println(result);

[結果]
あいうえおがぎぐげご あいうえおがぎぐげご

ひらがな→カタカナ

 ひらがなを全角カタカナに変換することもできます。

Transliterator transliterator = Transliterator.getInstance("Hiragana-Katakana");
String result = transliterator.transliterate("あいうえおがぎぐげご");
System.out.println(result);

[結果]
アイウエオガギグゲゴ

ひらがな→ローマ字

 ひらがなをローマ字に変換することもできます。 但し小文字のローマ字に変換されるので、大文字にする必要があればもう一段階の変換が必要です。

Transliterator transliterator = Transliterator.getInstance("Hiragana-Latin");
String result = transliterator.transliterate("あいうえおがぎぐげご");
System.out.println(result);

[結果]
aiueogagigugego

おわりに

 いかがだったでしょうか? ICU4J の便利さが伝わったでしょうか? 文中でも述べた通り java.text.Normalizer クラスと上手く使い分けて、プロジェクトで利用してみてください

Java環境構築へ戻る

更新履歴

  • 2014年08月03日 – 初稿を執筆しました。
  • 2015年09月07日 – 誤った表現を修正し、文章を再構成しました。

Javaのトップへ戻る

著者 : OSCA

OSCA

Java, PHP 系のWEBエンジニア。 WEBエンジニア向けコミュニティ「WEBエンジニア勉強会」を主催。 個人として何か一つでも世の中の多くの人に使ってもらえるものを作ろうと日々奮闘中。
@engineer_osca