Поддержка Unicode и интернационализации

Android использует библиотеку ICU и проект CLDR для предоставления поддержки Unicode и других интернационализаций. Обсуждение Unicode и поддержки интернационализации на этой странице разделено на два раздела: Android 6.0 (уровень API 23) и ниже, и Android 7.0 (уровень API 24) и выше.

Поддержка Unicode и интернационализации через Android 6.0 (API уровня 23)

Платформа Android использует ICU и CLDR для реализации различных классов для обработки как латинской, так и нелатинской орфографии, предоставляя такие классы, как Locale , Character и множество подклассов java.text . Приложение, которому требуются функции интернационализации за пределами предоставляемых классов и которое нацелено на версии платформы вплоть до Android 6.0 (API уровня 23), должно включать библиотеку ICU.

Версионирование

Последовательные выпуски платформы Android соответствуют более новым версиям ICU и соответствующим версиям CLDR и Unicode. Таблица 1 показывает это соответствие до Android 6.0 (API уровня 23).

Таблица 1. Версии ICU и CLDR, используемые через Android 6.0 (уровень API 23).

Платформа (уровень API) ОИТ КЛДР Юникод
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 Framework обеспечивает более полную поддержку Unicode и интернационализации для приложений, ориентированных на Android 7.0 (API уровня 24) и выше. В следующем разделе этой страницы приведены подробности об этой поддержке.

Поддержка Unicode и интернационализации в Android 7.0 (API уровня 24) и выше

Для Android 7.0 (уровень API 24) и выше платформа Android предоставляет разработчикам приложений подмножество API ICU4J для использования в пакете android.icu . ICU4J — это широко используемый набор библиотек Java с открытым исходным кодом, обеспечивающий поддержку Unicode и интернационализации для программных приложений.

API ICU4J используют данные локализации, имеющиеся на устройстве. В результате вы можете уменьшить размер вашего приложения, не компилируя библиотеки ICU4J в свое приложение. Вместо этого вы можете вызывать их в фреймворке. Если вы это сделаете, вам может потребоваться предоставить несколько версий вашего APK , чтобы пользователи, работающие с версиями Android ниже Android 7.0 (уровень API 24), могли загрузить версию приложения, содержащую библиотеки ICU4J.

Этот раздел начинается с предоставления некоторой базовой информации о минимальных уровнях API Android, необходимых для поддержки этих библиотек. Затем он объясняет, что вам нужно знать о реализации ICU4J для Android. Наконец, он рассказывает вам, как использовать API ICU4J в фреймворке Android.

ICU4J на Android

Android предоставляет подмножество API ICU4J через пакет android.icu , а не com.ibm.icu . Некоторые API ICU4J не предоставляются фреймворком Android по таким причинам, как устаревшие API или не объявленные стабильными. Поскольку команда ICU в будущем будет объявлять API устаревшими, Android также помечает их как устаревшие, но продолжает включать их.

Вот несколько напоминаний:

  • API-интерфейсы Android-фреймворка ICU4J не включают в себя все API-интерфейсы ICU4J.
  • API-интерфейсы в фреймворке Android не заменяют поддержку локализации с помощью ресурсов в Android.
  • В некоторых случаях фреймворк Android поддерживает больше символов, чем библиотеки ICU. Это касается, например, поддержки эмодзи классом android.text .

Перейти на пакет android.icu из com.ibm.icu

Если вы уже используете API ICU4J в своем приложении, и API android.icu соответствуют вашим требованиям, то для перехода на API фреймворка вам потребуется изменить импорт Java с com.ibm.icu на android.icu . Затем вы можете удалить собственную копию файлов ICU4J из приложения.

Примечание : API-интерфейсы фреймворка ICU4J используют пространство имен android.icu вместо com.ibm.icu . Это необходимо для того, чтобы избежать конфликтов пространств имен в приложениях, содержащих собственные библиотеки com.ibm.icu .

Переход на API android.icu с других API Android SDK

Некоторые классы в пакетах 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

ICU4C на Android

Android предоставляет подмножество API ICU4C через библиотеку libicu.so , а не libicuuc.so или libicui18n.so . API доступны, начиная с Android 12 (уровень API 31). Заголовки NDK доступны, начиная с выпуска NDK r22b. API C++ не предоставляется через Android NDK. Некоторые API C недоступны.

Версионирование

Последовательные выпуски платформы Android соответствуют более новым версиям ICU и соответствующим версиям CLDR и Unicode. Таблица 3 показывает это соответствие, начиная с Android 7.0 (уровень API 24). Используйте API VersionInfo.ICU_VERSION (доступно с Android 7.0) для получения информации о версии ICU во время выполнения.

Таблица 3. Версии ICU и CLDR, используемые в версиях Android от Android 7.0 (уровень API 24) до Android 15 (уровень API 35).

Платформа (уровень API) ОИТ КЛДР Юникод
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–32) 68.2 38.1 13.0
Android 13 (уровень API 33) 70.1 40 14.0
Android 14 (уровень API 34) 72.1 42 15.0
Android 15 (уровень API 35) 75.1 45 15.1

Настройка формата времени 24ч/12ч

ICU на Android не соблюдает настройку 24-часового/12-часового формата времени пользователя, полученную из DateFormat.is24HourFormat() . Чтобы соблюдать эту настройку, используйте методы форматирования времени DateFormat или DateUtils или используйте шаблоны форматирования времени ICU с соответствующими символами шаблона часов ('h' для 12h, 'H' для 24h) для различных возвращаемых значений is24HourFormat() . Например, этот код генерирует строку с текущим временем, которая соблюдает настройку 12h/24h пользователя:

Котлин

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

Ява

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 предоставляется для транслитерации текста из одного формата в другой. Набор доступных идентификаторов транслитерации нестабилен в разных версиях Android и на разных устройствах. Производители устройств могут добавлять дополнительные идентификаторы транслитерации. Разработчики должны проверять доступные идентификаторы, полученные из Transliterator.getAvailableIDs() , перед транслитерацией текста.

Лицензирование

ICU4J выпущен под лицензией ICU. Подробности см. в руководстве пользователя ICU .