Поддержка Unicode и разных языковых стандартов

Для поддержки Unicode и других средств интернационализации в Android используются библиотека ICU и проект CLDR. В этом разделе информация о поддержке 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 и уровней API до Android 6.0 (уровень API 23).

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

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

Поддержка Юникода и интернационализации в Android 7.0 (уровень API 24) и более поздних версиях.

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

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

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

ICU4J на Android

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

Вот несколько важных моментов:

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

Переход с пакета com.ibm.icu на android.icu

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

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

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

Некоторые классы в пакетах java и android имеют эквиваленты в ICU4J. Однако ICU4J часто обеспечивает более широкую поддержку стандартов и языков.

В таблице 2 приведены примеры таких эквивалентов.

Таблица 2. Классы ICU4J в Android и Java

Класс Альтернативы
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. C++ API не предоставляется через Android NDK. Некоторые API C недоступны.

Управление версиями

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

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

Платформа (уровень API) ОРИТ : реанимация [informal] 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–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

Настройка формата времени (12- или 24-часовой)

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

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

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

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