Unicode と国際化のサポート

Android は、ICU ライブラリCLDR プロジェクトを活用して、Unicode や各種国際化をサポートしています。このドキュメントでは、Unicode と国際化のサポートについて、Android 6.0(API レベル 23)以前と Android 7.0(API レベル 24)以降の 2 つのセクションに分けて説明します。

Android 6.0(API レベル 23)以前の Unicode と国際化のサポート

Android プラットフォームは、ICU と CLDR を使用して、ラテン文字と非ラテン文字の両方を処理するためのさまざまなクラスを実装し、Locale クラスや Character クラス、ならびに java.text の各種サブクラスなどのクラスをエクスポーズします。Android 6.0(API レベル 23)以前のプラットフォームのバージョンをターゲットとするアプリが、エクスポーズしたクラスを超える国際化機能を実装する場合、APK 内に ICU ライブラリを含める必要があります。

バージョン

Android プラットフォームの各リリースは、それぞれその時点の ICU の最新バージョン(および対応する CLDR バージョンと Unicode バージョン)に対応しています。Android 6.0(API レベル 23)以前の対応状況を表 1 に示します。

表 1: Android 6.0(API レベル 23)以前のリリースで使用される ICU と CLDR のバージョン

プラットフォーム(API レベル) ICU CLDR Unicode
Android 1.5~2.0(API レベル 3~7) 3.8 1.5 5.0
Android 2.2(API レベル 8) 4.2 1.7 5.1
Android 2.3~3.0(API レベル 9~13) 4.4 1.8 5.2
Android 4.0(API レベル 14~15) 4.6 1.9 6.0
Android 4.1(API レベル 16~17) 4.8 2.0 6.0
Android 4.3(API レベル 18) 50 22.1 6.2
Android 4.4(API レベル 19~20) 51 23 6.2
Android 5.0(API レベル 21~22) 53 25 6.3
Android 6.0(API レベル 23) 55.1 27.0.1 7.0

Android 7.0(API レベル 24)以降をターゲットとしているアプリの場合、Android フレームワークがエクスポーズする包括的な Unicode と国際化のサポートを活用できます。次のセクションでは、このサポートについて詳しく説明します。

Android 7.0(API レベル 24)以降の Unicode と国際化のサポート

Android 7.0(API レベル 24)以降、Android プラットフォームは、android.icu パッケージ内で、アプリ デベロッパーが使用できる ICU4J API のサブセットをエクスポーズしています。ICU4J は、ソフトウェア アプリで Unicode と国際化をサポートする際に広く利用されているオープンソースの Java ライブラリ セットです。

ICU4J API は、デバイス上に存在するローカライゼーション データを使用します。そのため、ICU4J ライブラリを APK 内にコンパイルせずに、フレームワーク内で呼び出すことで、APK フットプリントを削減することができます(この場合、Android 7.0(API レベル 24)よりも前のバージョンの Android を利用しているユーザーが ICU4J ライブラリを格納したバージョンのアプリをダウンロードできるように、複数の APK バージョンを提供することをおすすめします)。

このドキュメントでは、まず、ライブラリをサポートする際に必要となる最小 Android API レベルの基本情報について説明します。次に、Android のリリースごとの ICU4J 実装について知っておくべき情報について説明します。最後に、Android フレームワーク内で ICU4J API を使用する方法について説明します。

Android 上の ICU4J

Android は、com.ibm.icu パッケージではなく android.icu パッケージを通じて、ICU4J API のサブセットをエクスポーズします。さまざまな理由により、Android フレームワークが ICU4J API をエクスポーズしないことがあります。たとえば、対象 API のサポートが終了している場合や、対象 API が安定版として宣言されていない場合などが該当します。ICU チームが API のサポートを終了した場合、Android もその API をサポート終了としてマーキングしますが、API 自体は引き続き組み込まれた状態を維持します。

次の点に注意してください。

  • ICU4J Android フレームワーク API には、必ずしもすべての ICU4J API が含まれているわけではありません。
  • NDK は Android ICU4C をサポートしていません。
  • Android フレームワーク内の API は、リソースを使用したローカライズのサポートに代わるものではありません。
  • 場合によっては、Android フレームワークの方が、ICU ライブラリよりも多くの文字をサポートしていることがあります。たとえば、android.text クラスの絵文字のサポートがこれに該当します。

com.ibm.icu パッケージから android.icu パッケージに移行する

すでにアプリ内で ICU4J API を使用していて、android.icu API が要件を満たしている場合、フレームワーク API に移行するには、Java インポートを com.ibm.icu から android.icu に変更する必要があります。移行後は、ICU4J ファイルのコピーを APK から削除できます。

: ICU4J フレームワーク API は、com.ibm.icu 名前空間ではなく、android.icu 名前空間を使用します。これは、APK 内で独自の com.ibm.icu ライブラリを格納している場合に、名前空間の競合が発生しないようにするためです。

他の Android SDK API から android.icu API に移行する

java パッケージや android パッケージ内のクラスの中には、ICU4J 内のクラスと同等のものがあります。ただし、通常は ICU4J の方が規格や言語に関して幅広いサポートを提供しています。

同等のクラスの主な例を表 2 に示します。

表 2: Android と Java ICU4J のクラス

クラス 代替
java.lang.Character android.icu.lang.UCharacter
java.text.BreakIterator android.icu.text.BreakIterator
java.text.DecimalFormat android.icu.text.DecimalFormat
java.util.Calendar android.icu.util.Calendar
android.text.BidiFormatter android.icu.text.Bidi
android.text.format.DateFormat android.icu.text.DateFormat
android.text.format.DateUtils android.icu.text.DateFormat android.icu.text.RelativeDateTimeFormatter

バージョン

Android プラットフォームの各リリースは、それぞれその時点の ICU の最新バージョン(および対応する CLDR バージョンと Unicode バージョン)に対応しています。Android 7.0(API レベル 24)以降の対応状況を表 3 に示します。

表 3: Android 7.0(API レベル 24)以降のリリースで使用される ICU と CLDR のバージョン

プラットフォーム(API レベル) ICU CLDR Unicode
Android 7.0~7.1(API レベル 24~25) 56 28 8.0
Android 8.0~8.1(API レベル 26~27) 58.2 30.0.3 9.0
Android 9(API レベル 28) 60.2 32.0.1 10.0
Android 10(API レベル 29) 63.2 34 11.0

時刻形式の設定(24 時間形式 / 12 時間形式)

Android 上の ICU は、ユーザーの時刻形式設定(24 時間形式または 12 時間形式。DateFormat.is24HourFormat() から取得)を検出しません。設定を検出するには、DateFormat または DateUtils の時刻形式メソッドを使用するか、ICU 時刻形式パターンを使用し、各時刻パターン記号(12 時間形式の場合は「h」、24 時間形式の場合は「H」)に対して異なる is24HourFormat() 戻り値を指定します。たとえば、次のコードの場合、ユーザーの 12 時間形式 / 24 時間形式の設定を検出する現在時刻の文字列が生成されます。

Kotlin

    val skeleton: String = if (DateFormat.is24HourFormat(context)) "Hm" else "hm"
    val formattedTime: String = android.icu.text.DateFormat.getInstanceForSkeleton(
            skeleton,
            Locale.getDefault()).format(Date()
    )
    

Java

    String skeleton = DateFormat.is24HourFormat(context) ? "Hm" : "hm";
    String formattedTime = android.icu.text.DateFormat.getInstanceForSkeleton(skeleton, Locale.getDefault()).format(new Date());
    

文字変換機能の安定性

Android 10(API レベル 29)以降、テキストの文字の形式を変換できる Transliterator が用意されています。利用できる文字変換 ID のセットは、Android リリースやデバイス間で一定ではありません。デバイス メーカーによっては、文字変換 ID を追加している場合があります。デベロッパーは、テキストの文字を変換する前に、利用可能な ID(Transliterator.getAvailableIDs() から取得)をチェックする必要があります。

ライセンス

ICU4J は、ICU ライセンスの下でリリースされています。詳細については、ICU ユーザーガイドをご覧ください。