萬國碼 (Unicode) 和國際化支援

Stay organized with collections Save and categorize content based on your preferences.

Android 會利用 ICU 程式庫CLDR 專案提供萬國碼 (Unicode) 和其他國際化支援。本文件的 Unicode 和國際化支援討論分為兩個部分:Android 6.0 (API 級別 23) 以下版本,以及 Android 7.0 (API 級別 24) 以上版本。

透過 Android 6.0 (API 級別 23) 提供的 Unicode 和國際化支援

Android 平台使用 ICU 和 CLDR,實作不同的拉丁文和非拉丁文正寫法處理類別,從而公開 LocaleCharacter 及許多 java.text 的子類別。如果應用程式需要公開類別以外的國際化功能,並透過 Android 6.0 (API 級別 23) 指定使用的平台版本,則必須包含 ICU 程式庫。

版本管理

連續發布的 Android 平台會對應至較新版本的 ICU (以及對應的 CLDR 和 Unicode 版本)。表 1 顯示這種透過 Android 6.0 (API 級別 23) 的對應。

表 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 平台會公開 ICU4J API 的子集,方便應用程式開發人員在 android.icu 套件下使用。ICU4J 是一種開放原始碼組合,廣泛用於 Java 程式庫,為軟體應用程式提供 Unicode 和國際化支援。

ICU4J API 會使用裝置中顯示的本地化資料。因此,您不需將 ICU4J 程式庫編譯到應用程式內,改從架構中呼叫程式庫即可,這樣便能縮減應用程式的大小。(如果採取這種做法,建議您提供多個 APK 版本,讓執行 Android 7.0 (API 級別 24) 以下版本的 Android 使用者可下載包含 ICU4J 程式庫的應用程式版本。)

本文件會先提供一些基本資訊,協助您瞭解支援這些程式庫所需的最低 Android API 級別。接下來,我們將說明 Android 實作 ICU4J 的特定重要須知。最後,我們將說明如何在 Android 架構中使用 ICU4J API。

Android 上的 ICU4J 運用

Android 會透過 android.icu 套件 (而非 com.ibm.icu) 公開 ICU4J API 的子集。Android 架構可能會基於各種原因選擇不公開 ICU4J API,例如:API 已淘汰,或是並未宣告處於穩定狀態。當 ICU 團隊在未來淘汰 API 後,Android 也會將其標示為已淘汰,但仍會繼續納入這些 API。

請注意以下事項:

  • ICU4J Android 架構 API 不包含所有 ICU4J API。
  • Android 架構中的 API 不會取代 Android 對於使用相關資源進行本地化的支援。
  • 在某些情況下,Android 架構支援的字元數比 ICU 程式庫更多。舉例來說,android.text 類別對於表情符號的支援便是如此。

從 com.ibm.icu 遷移至 android.icu 套件

如果已在應用程式中使用 ICU4J API,且 android.icu API 符合您的需求,則遷移至架構 API 時,您就必須將 Java 匯入項目從 com.ibm.icu 變更為 android.icu。然後,您就可以從應用程式中移除自己的 ICU4J 檔案副本。

注意:ICU4J 架構 API 使用 android.icu 命名空間,而不是 com.ibm.icu。這是為了避免應用程式中的命名空間因包含自己的 com.ibm.icu 程式庫而發生衝突。

從其他 Android SDK API 遷移至 android.icu API

javaandroid 套件中的部分類別與 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 會透過 libicu.so 程式庫公開 ICU4C API 的子集 (而非 libicuuc.solibicui18n.so)。此 API 自 Android 12 (API 級別 31) 開始提供,NDK 標頭自 NDK 版本 r22b 開始提供。系統不會透過 Android NDK 公開 C++ API,部分 C API 尚未提供。

版本管理

連續發布的 Android 平台會對應至較新版本的 ICU (以及對應的 CLDR 和 Unicode 版本)。表 3 顯示自 Android 7.0 (API 級別 24) 開始的對應情況。

表 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() 取得)。如果要採行此設定,您可以使用 DateFormatDateUtils 時間格式方式,或搭配合適的小時模式符號 (12 小時為「h」,24 小時為「H」) 使用 ICU 時間格式模式,以取得不同的 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());

Transliterator 的穩定性

自 Android 10 (API 級別 29) 起,系統會提供 Transliterator,將文字從一種格式音譯成另一種格式。可用的音譯 ID 組合在 Android 發布版本和裝置之間並不穩定。裝置製造商可能會加入額外的音譯 ID。音譯文字前,開發人員必須先檢查可用的 ID (自 Transliterator.getAvailableIDs() 取得)。

授權

ICU4J 是根據 ICU 授權發布。詳情請參閱 ICU 使用手冊