Поддержка 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 обеспечивает более полную поддержку 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 по таким причинам, как устаревшие или не объявленные стабильными. Поскольку команда 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). Для получения информации о версии ICU во время выполнения используйте API VersionInfo.ICU_VERSION (доступен с Android 7.0).

Таблица 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' для 12-часового формата, 'H' для 24-часового формата) для различных возвращаемых значений is24HourFormat() . Например, этот код генерирует строку с текущим временем, учитывающую заданный пользователем формат времени (12/24):

Котлин

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 .