Unicode y compatibilidad internacional

Android aprovecha la biblioteca de ICU y el proyecto CLDR para proporcionar compatibilidad con Unicode y otros tipos de internacionalización. La información incluida en esta página sobre la compatibilidad con Unicode y la internacionalización se divide en dos secciones: Android 6.0 (nivel de API 23) y versiones anteriores, y Android 7.0 (nivel de API 24) y versiones posteriores.

Compatibilidad con Unicode y la internacionalización a través de Android 6.0 (nivel de API 23)

La plataforma Android usa ICU y CLDR en la implementación de varias clases para manejar ortografías latinas y no latinas exponiendo clases como Locale, Character y muchas subclases de java.text. Una app que requiere funcionalidades de internacionalización más allá de las clases expuestas y que se dirige a las versiones de la plataforma a través de Android 6.0 (nivel de API 23) debe incluir la biblioteca de ICU.

Control de versiones

Los sucesivos lanzamientos de la plataforma de Android corresponden a versiones más recientes de ICU y las versiones correspondientes de CLDR y Unicode. En la Tabla 1, se muestra esta correspondencia mediante Android 6.0 (nivel de API 23).

Tabla 1: Versiones de ICU y CLDR utilizadas en Android 6.0 (nivel de API 23)

Plataforma (nivel de API) ICU CLDR Unicode
Android 1.5 a 2.0 (niveles de API 3 a 7) 3.8 1.5 5.0
Android 2.2 (nivel de API 8) 4.2 1.7 5.1
Android 2.3 a 3.0 (niveles de API 9 a 13) 4.4 1.8 5.2
Android 4.0 (niveles de API 14 y 15) 4.6 1.9 6.0
Android 4.1 (niveles de API 16 y 17) 4.8 2.0 6.0
Android 4.3 (nivel de API 18) 50 22.1 6.2
Android 4.4 (niveles de API 19 y 20) 51 23 6.2
Android 5.0 (niveles de API 21 y 22) 53 25 6.3
Android 6.0 (nivel de API 23) 55.1 27.0.1 7.0

El framework de Android proporciona compatibilidad más completa con Unicode y la internacionalización para apps orientadas a Android 7.0 (nivel de API 24) y versiones posteriores. La siguiente sección de esta página proporciona detalles sobre la compatibilidad mencionada.

Compatibilidad con Unicode y la internacionalización en Android 7.0 (nivel de API 24) y versiones posteriores

En el caso de Android 7.0 (nivel de API 24) y versiones posteriores, la plataforma de Android expone un subconjunto de las APIs de ICU4J para que los desarrolladores de apps usen con el paquete android.icu. ICU4J es un conjunto ampliamente utilizado de bibliotecas Java de código abierto, que proporciona compatibilidad con Unicode y la internacionalización para aplicaciones de software.

Las APIs de ICU4J utilizan datos de localización presentes en el dispositivo. Como resultado, puedes reducir la huella de tu app gracias a que no compilas las bibliotecas ICU4J en esta. En su lugar, puedes llamarlas directamente en el framework. Si lo haces, intenta brindar varias versiones del APK para que los usuarios que ejecutan versiones de Android anteriores a Android 7.0 (nivel de API 24) puedan descargar una versión de la app que contenga las bibliotecas de ICU4J.

Esta sección comienza suministrando información básica sobre los niveles mínimos de API de Android necesarios para admitir estas bibliotecas. Luego, se explica lo que debes saber sobre la implementación específica de ICU4J en Android. Por último, verás cómo usar las APIs de ICU4J en el framework de Android.

ICU4J en Android

Android expone un subconjunto de las APIs de ICU4J a través del paquete android.icu, en lugar de com.ibm.icu. El framework de Android no expone algunas APIs de ICU4J, por ejemplo, si las APIs dejaron de estar disponibles o si no se declararon estables. Como el equipo de ICU dejará de usar las APIs en el futuro, Android también las marca como obsoletas, pero continúa incluyéndolas.

Estos son algunos recordatorios:

  • Las APIs del framework de ICU4J para Android no incluyen todas las APIs de ICU4J.
  • Las APIs del framework de Android no reemplazan la compatibilidad de Android para localizar recursos.
  • En algunos casos, el framework de Android es compatible con más caracteres que las bibliotecas de ICU. Un ejemplo de esto es la compatibilidad de la clase android.text con los emojis.

Cómo migrar al paquete android.icu desde com.ibm.icu

Si ya estás utilizando las APIs de ICU4J en tu app, y las APIs de android.icu cumplen con tus requisitos, entonces, para migrar a las APIs del framework, tendrás que cambiar tus importaciones Java de com.ibm.icu a android.icu. Luego, podrás quitar tu propia copia de los archivos de ICU4J de la app.

Nota: Las APIs del framework de ICU4J usan el espacio de nombres android.icu en lugar de com.ibm.icu para evitar conflictos de espacio de nombres en las apps que contienen sus propias bibliotecas com.ibm.icu.

Cómo migrar las APIs de android.icu desde otras APIs del SDK de Android

Algunas clases en los paquetes java y android tienen equivalentes a los encontrados en ICU4J. Sin embargo, a menudo, ICU4J proporciona una mayor compatibilidad con los estándares y los idiomas.

La tabla 2 muestra algunos ejemplos de estas equivalencias para que puedas empezar:

Tabla 2: Clases de ICU4J para Android y Java

Clase Alternativas
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 en Android

Android expone un subconjunto de las APIs de ICU4C a través de la biblioteca libicu.so, en lugar de libicuuc.so o libicui18n.so. Las APIs están disponibles a partir de Android 12 (nivel de API 31). Los encabezados del NDK están disponibles a partir de la versión r22b del NDK. No se expone ninguna API de C++ a través del NDK de Android. Algunas de las APIs de C todavía no están disponibles.

Control de versiones

Los sucesivos lanzamientos de la plataforma de Android corresponden a versiones más recientes de ICU y las versiones correspondientes de CLDR y Unicode. En la Tabla 3, se muestra esta correspondencia a partir de Android 7.0 (nivel de API 24). Usa la API de VersionInfo.ICU_VERSION (disponible desde Android 7.0) para obtener la información de la versión de ICU durante el tiempo de ejecución.

Tabla 3: Versiones de ICU y CLDR utilizadas en versiones de Android desde Android 7.0 (nivel de API 24) hasta Android 15 (nivel de API 35)

Plataforma (nivel de API) ICU CLDR Unicode
Android 7.0 y 7.1 (niveles de API 24 y 25) 56 28 8.0
Android 8.0 y 8.1 (niveles de API 26 y 27) 58.2 30.0.3 9.0
Android 9 (nivel de API 28) 60.2 32.0.1 10.0
Android 10 (nivel de API 29) 63.2 34 11.0
Android 11 (nivel de API 30) 66.1 36 13.0
Android 12 (niveles de API 31 a 32) 68.2 38.1 13.0
Android 13 (nivel de API 33) 70.1 40 14.0
Android 14 (nivel de API 34) 72.1 42 15.0
Android 15 (nivel de API 35) 75.1 45 15.1

Configuración de formato de hora de 24 h/12 h

ICU en Android no observa la configuración de formato de hora de 24 h/12 h del usuario, que se obtiene de DateFormat.is24HourFormat(). Para observar esta configuración, usa los métodos de formato de hora DateFormat o DateUtils, o bien los patrones de formato de hora de ICU con los símbolos de patrón de hora apropiados ("h" para 12 h, "H" para 24 h) para diferentes valores que se muestran de is24HourFormat(). Por ejemplo, este código genera una cadena con la hora actual que observa la configuración de 12 h/24 h del usuario:

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());

Estabilidad del transliterador

A partir de Android 10 (nivel de API 29), se proporciona Transliterator para transliterar el texto de un formato a otro. El conjunto de IDs de transliteración disponibles es inestable en las versiones y dispositivos de Android. Los fabricantes de dispositivos pueden agregar IDs de transliteración adicionales. Los desarrolladores deben verificar los IDs disponibles, obtenidos de Transliterator.getAvailableIDs(), antes de transliterar el texto.

Licencias

ICU4J se lanzó bajo la licencia de ICU. Para obtener más información, consulta la Guía del usuario de ICU.