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)以前のプラットフォームのバージョンをターゲットとするアプリが、エクスポーズしたクラスを超える国際化機能を実装する場合、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 ライブラリをアプリ内にコンパイルせずに、フレームワーク内で呼び出すことで、アプリのフットプリントを削減することができます(この場合、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 が含まれているわけではありません。
  • Android フレームワーク内の API は、リソースを使用したローカライズのサポートに代わるものではありません。
  • 場合によっては、Android フレームワークの方が、ICU ライブラリよりも多くの文字をサポートしていることがあります。たとえば、android.text クラスの絵文字のサポートがこれに該当します。

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

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

: ICU4J フレームワーク API は、com.ibm.icu 名前空間ではなく、android.icu 名前空間を使用します。これは、アプリ内で独自の 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 上の ICU4C

Android は、libicuuc.solibicui18n.so ではなく libicu.so ライブラリを通じて、ICU4C API のサブセットをエクスポーズします。API は Android 12(API レベル 31)以降で使用できます。NDK ヘッダーは NDK リリース r22b 以降で使用できます。C++ API は Android NDK を通じてエクスポーズされません。一部の C API はまだご利用いただけません。

バージョニング

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
Android 11(API レベル 30) 66.1 36 13.0
Android 12(API レベル 31) 68.2 38.1 13.0

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

Android の ICU では、ユーザーの時刻形式設定(24 時間形式または 12 時間形式。DateFormat.is24HourFormat() から取得)は考慮されません。設定を適用するには、DateFormat または DateUtils の時刻形式メソッドを使用するか、ICU 時刻形式パターンを使用し、is24HourFormat() の異なる戻り値に応じて適切な時刻パターン記号(12 時間形式の場合は「h」、24 時間形式の場合は「H」)を付加します。たとえば、次のコードでは、ユーザーの 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 ユーザーガイドをご覧ください。