Android 6.0でICU4Jを使用して文字列の全角と半角を変換する

今回、文字列の半角と全角の変換を手軽に行いたかったため、ICU4Jというライブラリを試してみました。

ICU4Jとは

ICUとはユニコードと国際化をサポートするライブラリセットで、ICU4JはICUにおけるJava向けのライブラリです。

ICU4J互換のAPIがAndroid 7.0から公式のSDKに含まれていますが、開発中のアプリで6.0をサポートしたかったため、今回はICU4Jのライブラリをそのまま使用します。

導入

アプリモジュールのbuild.gradleのdependenciesに下記を追加します。

implementation 'com.ibm.icu:icu4j:使用するICU4Jのバージョン'

動作環境のAPIレベルによって、互換性があるICU4Jのバージョンは異なります。次のAndroidの公式ドキュメントに、APIレベルごとに互換性があるICU4Jのバージョンが記載されているので、まずは確認しましょう。

たとえば、開発中のアプリのminSdkVersionが23(Android 6.0)の場合は、次のように55.1を指定します。

implementation 'com.ibm.icu:icu4j:55.1'

これで、Android 7.0とは互換性があって動くのに、Android 6.0ではクラッシュしてしまうといった問題を避けられます。

この記事での実行結果などは、このバージョン55.1を使用した場合の結果を記載します。

実装と動作確認

ICU4Jが提供しているTransliteratorクラスを使用します。実装時に誤ってSDKのAPIをimportしないように気をつけましょう。

// このブログの記事のようにICU4Jのライブラリをそのまま使用する場合は次のコードでimport
import com.ibm.icu.text.Transliterator

// Androidの公式SDKのICU4J互換のAPIを使用する場合。この記事では使用していない
// import android.icu.text.Transliterator

全角から半角に変換する

Transliterator#getInstance()の引数に"Fullwidth-Halfwidth"を指定して使用します。

// 全角から半角への変換
val toHalfwidthTransliterator = Transliterator.getInstance("Fullwidth-Halfwidth")
val fullwidthText = "123456789@abcdefg"
val halfwidthResult =
    toHalfwidthTransliterator.transliterate(fullwidthText) // => "123456789@abcdefg"

半角から全角に変換する

Transliterator#getInstance()の引数に"Halfwidth-Fullwidth"を指定して使用します。さきほどとは、FullwidthHalfwidthの記述が逆になっていることに注意してください。

// 半角から全角への変換
val toFullwidthTransliterator = Transliterator.getInstance("Halfwidth-Fullwidth")
val halfwidthText = "123456789@abcdefg"
val fullwidthResult =
    toFullwidthTransliterator.transliterate(halfwidthText) // => "123456789@abcdefg"

さいごに

ICU4Jを使用して、手軽に半角と全角文字列の変換が行えました。

この記事ではICU4Jを使用しましたが、java.text.Normalizerを使用して行う方法もあるようです。ユニコードの正規化を目的としたAPIなので、期待していない変換も行われるようですが、要件次第ではICU4Jを導入するよりも良い選択肢かもしれません。

また、ユニコードに新しく追加された絵文字や、Androidでしかサポートされていない絵文字を対象とした処理が必要な場合は、Androidの公式ドキュメントを参考に、ICU4J互換のAPIの使用を検討しても良さそうです。

使用した環境など

Android Studio

Android Studio 3.5
Build #AI-191.8026.42.35.5791312, built on August 9, 2019
JRE: 1.8.0_202-release-1483-b49-5587405 x86_64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
macOS 10.15.2

動作検証端末

下記設定のエミュレータ。

  • Nexus 5X Android 6.0 (API 23) x86_64
  • Pixel 3a Android 9.0 (API 28) x86_64

参考