Compatibilité avec Unicode et les normes d'internationalisation

Restez organisé à l'aide des collections Enregistrez et classez les contenus selon vos préférences.

Android s'appuie sur la bibliothèque ICU et le projet CLDR pour prendre en charge Unicode et d'autres normes d'internationalisation. Ce document traite de cette prise en charge et est divisé en deux sections : Android 6.0 (niveau d'API 23) et versions antérieures, et Android 7.0 (niveau d'API 24) et versions ultérieures.

Compatibilité avec Unicode et les normes d'internationalisation via Android 6.0 (niveau d'API 23)

La plate-forme Android utilise ICU et CLDR pour implémenter diverses classes pour le traitement des orthographies latines et non latines, en exposant des classes telles que Locale, Character et de nombreuses sous-classes de java.text. Une application qui nécessite des fonctionnalités d'internationalisation au-delà des classes exposées et qui cible les versions de la plate-forme via Android 6.0 (niveau d'API 23) doit inclure la bibliothèque ICU.

Gestion des versions

Les versions successives de la plate-forme Android correspondent aux versions les plus récentes de la bibliothèque ICU (ainsi qu'aux versions CLDR et Unicode correspondantes). Le tableau 1 illustre cette correspondance via Android 6.0 (niveau d'API 23).

Tableau 1. Versions ICU et CLDR utilisées via Android 6.0 (niveau d'API 23)

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

Les applications ciblant Android 7.0 (niveau d'API 24) ou version ultérieure bénéficient d'une compatibilité plus complète avec Unicode et l'internationalisation dans le cadre du framework Android. La section suivante de ce document fournit des informations sur cette compatibilité.

Compatibilité avec Unicode et les normes d'internationalisation sur Android 7.0 (niveau d'API 24) ou version ultérieure

À partir d'Android 7.0 (niveau d'API 24), la plate-forme Android expose un sous-ensemble des API ICU4J que les développeurs d'applications peuvent utiliser dans le package android.icu. ICU4J est un ensemble de bibliothèques Java Open Source couramment utilisé, qui assure la compatibilité avec Unicode et l'internationalisation pour les applications logicielles.

Les API ICU4J utilisent les données de localisation présentes sur l'appareil. Par conséquent, vous pouvez réduire l'encombrement de votre application en n'y compilant pas les bibliothèques ICU4J. Il suffit de les appeler dans le framework. Dans ce cas, vous pouvez fournir plusieurs versions de votre APK afin que les utilisateurs des versions d'Android antérieures à Android 7.0 (niveau d'API 24) puissent télécharger une version de l'application qui contient les bibliothèques ICU4J.

Ce document fournit des informations de base sur les niveaux d'API Android minimaux requis pour prendre en charge ces bibliothèques. Il explique ensuite tout ce que vous devez savoir sur l'implémentation d'ICU4J pour Android. Enfin, il décrit comment utiliser les API ICU4J dans le framework Android.

ICU4J sur Android

Android expose un sous-ensemble des API ICU4J via le package android.icu plutôt que com.ibm.icu. Le framework Android peut choisir de ne pas exposer les API ICU4J pour diverses raisons, par exemple parce que des API sont obsolètes ou ne sont pas déclarées comme stables. Lorsque l'équipe chargée de la bibliothèque ICU abandonnera des API à l'avenir, Android les marquera également comme obsolète, mais continuera de les inclure.

Voici quelques points importants à retenir :

  • Les API du framework Android ICU4J n'incluent pas toutes les API ICU4J.
  • Les API du framework Android ne remplacent pas la prise en charge Android de la localisation avec les ressources.
  • Dans certains cas, le framework Android accepte plus de caractères que les bibliothèques ICU. C'est le cas, par exemple, avec la classe android.text pour les emoji.

Passer de com.ibm.icu au package android.icu

Si vous utilisez déjà les API ICU4J dans votre application et que les API android.icu répondent à vos exigences, la migration vers les API du framework nécessite de remplacer les importations Java com.ibm.icu par android.icu. Vous pourrez ensuite supprimer votre propre copie des fichiers ICU4J de l'application.

Remarque : Les API du framework ICU4J utilisent l'espace de noms android.icu au lieu de com.ibm.icu. Cela permet d'éviter les conflits d'espaces de noms dans les applications qui contiennent leur propre bibliothèque com.ibm.icu.

Passer des API SDK Android aux API android.icu

Certaines classes dans les packages java et android ont des équivalents à ceux des classes ICU4J. Cependant, ICU4J prend souvent en charge les normes et les langages.

Le tableau 2 présente quelques exemples d'équivalences pour vous assister au cours de vos premiers pas :

Tableau 2. Classes ICU4J Android et Java

Classe Alternatives
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 sur Android

Android expose un sous-ensemble des API ICU4C via la bibliothèque libicu.so, plutôt que libicuuc.so ou libicui18n.so. Les API sont disponibles à partir d'Android 12 (niveau d'API 31). Les en-têtes de NDK sont disponibles à partir de la version r22b du NDK. Aucune API C++ n'est exposée via le NDK Android. Certaines API C ne sont pas encore disponibles.

Gestion des versions

Les versions successives de la plate-forme Android correspondent aux versions les plus récentes de la bibliothèque ICU (ainsi qu'aux versions CLDR et Unicode correspondantes). Le tableau 3 illustre cette correspondance à partir d'Android 7.0 (niveau d'API 24).

Tableau 3. Versions ICU et CLDR utilisées sur Android 7.0 (niveau d'API 24) ou version ultérieure

Plate-forme (niveau d'API) ICU CLDR Unicode
Android 7.0 à 7.1 (niveau d'API 24 à 25) 56 28 8.0
Android 8.0 à 8.1 (niveau d'API 26 à 27) 58.2 30.0.3 9.0
Android 9 (niveau d'API 28) 60.2 32.0.1 10.0
Android 10 (niveau d'API 29) 63.2 34 11.0
Android 11 (niveau d'API 30) 66.1 36 13.0
Android 12 (niveau d'API 31) 68.2 38.1 13.0

Paramètre de format d'heure 24 h ou 12 h

La bibliothèque ICU sur Android ne tient pas compte du paramètre de format d'heure 24 h ou 12 h (obtenu à partir de DateFormat.is24HourFormat() ). Pour respecter ce paramètre, utilisez les méthodes de mise en forme de l'heure DateFormat ou DateUtils, ou des modèles de mise en forme avec des symboles de format d'heure appropriés ("h" pour 12 h, "H" pour 24 h) pour différentes valeurs is24HourFormat() renvoyées. Par exemple, ce code génère une chaîne avec l'heure actuelle qui respecte le paramètre 12 h/24 h de l'utilisateur :

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

Stabilité du translittérateur

À partir d'Android 10 (niveau d'API 29), Transliterator permet d'effectuer la translittération du texte d'un format à un autre. L'ensemble des ID de translittération disponibles est instable entre les versions et les appareils Android. Les fabricants d'appareils ont la possibilité d'ajouter des ID de translittération supplémentaires. Les développeurs doivent vérifier les ID disponibles (obtenus à partir de Transliterator.getAvailableIDs()) avant d'effectuer la translittération du texte.

Licences

ICU4J est publié sous la licence ICU. Pour en savoir plus, consultez le Guide de l'utilisateur de la bibliothèque ICU.