Supporto Unicode e internazionalizzazione

Android utilizza la libreria ICU e il progetto CLDR per fornire supporto per Unicode e altri tipi di internazionalizzazione. La discussione in questa pagina sul supporto di Unicode e dell'internazionalizzazione è suddivisa in due sezioni: Android 6.0 (livello API 23) e versioni precedenti e Android 7.0 (livello API 24) e versioni successive.

Supporto per Unicode e internazionalizzazione tramite Android 6.0 (livello API 23)

La piattaforma Android utilizza ICU e CLDR per implementare varie classi per la gestione di ortografie latine e non latine, esponendo classi come Locale, Character e molte sottoclassi java.text. Un'app che richiede funzionalità di internazionalizzazione oltre le classi esposte e ha come target versioni della piattaforma tramite Android 6.0 (livello API 23), deve includere la libreria ICU.

Controllo delle versioni

Le release successive della piattaforma Android corrispondono alle versioni più recenti dell'ICU e alle versioni CLDR e Unicode corrispondenti. La Tabella 1 mostra questa corrispondenza tramite Android 6.0 (livello API 23).

Tabella 1. Versioni ICU e CLDR utilizzate tramite Android 6.0 (livello API 23).

Piattaforma (livello API) T.I. CLDR Unicode
Android 1.5-2.0 (livelli API 3-7) 3,8 1,5 5,0
Android 2.2 (livello API 8) 4.2 1,7 5.1
Android 2.3-3.0 (livelli API 9-13) 4,4 1,8 5.2
Android 4.0 (livelli API 14-15) 4,6 1,9 6.0
Android 4.1 (livelli API 16-17) 4,8 2,0 6.0
Android 4.3 (livello API 18) 50 22,1 6.2
Android 4.4 (livelli API 19-20) 51 23 6.2
Android 5.0 (livelli API 21-22) 53 25 6.3
Android 6.0 (livello API 23) 55,1 27.0.1 7,0

Il framework Android offre un supporto più completo per Unicode e l'internazionalizzazione delle app che hanno come target Android 7.0 (livello API 24) e versioni successive. La sezione successiva di questa pagina fornisce dettagli sull'assistenza.

Supporto di Unicode e internazionalizzazione in Android 7.0 (livello API 24) e versioni successive

Per Android 7.0 (livello API 24) e versioni successive, la piattaforma Android espone un sottoinsieme delle API ICU4J che gli sviluppatori di app possono utilizzare nel pacchetto android.icu. ICU4J è un insieme open source di librerie Java ampiamente usato che fornisce supporto Unicode e internazionalizzazione per le applicazioni software.

Le API ICU4J utilizzano i dati di localizzazione presenti sul dispositivo. Di conseguenza, puoi ridurre l'impatto della tua app evitando di compilare le librerie ICU4J nell'app. Puoi però richiamarle nel framework. Se lo scegli, potresti voler fornire più versioni dell'APK per consentire agli utenti che utilizzano versioni di Android precedenti ad Android 7.0 (livello API 24) di scaricare una versione dell'app contenente le librerie ICU4J.

Questa sezione inizia fornendo alcune informazioni di base sui livelli API Android minimi necessari per supportare queste librerie. Spiega poi cosa devi sapere sull'implementazione specifica per Android di ICU4J. Infine, spiega come utilizzare le API ICU4J nel framework Android.

ICU4J su Android

Android espone un sottoinsieme delle API ICU4J tramite il pacchetto android.icu, anziché com.ibm.icu. Alcune API ICU4J non sono esposte dal framework Android, ad esempio perché le API sono deprecate o non sono state dichiarate stabili. Poiché il team ICU ritirerà le API in futuro, Android le contrassegna come deprecate, ma continua a includerle.

Ecco alcuni promemoria:

  • Le API del framework Android ICU4J non includono tutte le API ICU4J.
  • Le API nel framework Android non sostituiscono il supporto di Android per la localizzazione con le risorse.
  • In alcuni casi, il framework Android supporta più caratteri rispetto alle librerie ICU. Questo vale, ad esempio, per il supporto delle emoji della classe android.text.

Esegui la migrazione al pacchetto android.icu da com.ibm.icu

Se utilizzi già le API ICU4J nella tua app e le API android.icu soddisfano i tuoi requisiti, la migrazione alle API framework richiede la modifica delle importazioni Java da com.ibm.icu a android.icu. Puoi quindi rimuovere la tua copia dei file ICU4J dall'app.

Nota: le API del framework ICU4J utilizzano lo spazio dei nomi android.icu anziché com.ibm.icu. Questo per evitare conflitti dello spazio dei nomi nelle app che contengono le proprie librerie com.ibm.icu.

Esegui la migrazione alle API android.icu da altre API SDK Android

Alcune classi nei pacchetti java e android hanno equivalenti a quelle che si trovano in ICU4J. Tuttavia, ICU4J offre spesso un supporto più ampio per standard e lingue.

La tabella 2 mostra alcuni esempi di queste equivalenze per iniziare:

Tabella 2.Classi ICU4J Android e Java

Classe Alternative
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 su Android

Android espone un sottoinsieme delle API ICU4C tramite la libreria libicu.so, anziché tramite libicuuc.so o libicui18n.so. Le API sono disponibili a partire da Android 12 (livello API 31). Le intestazioni NDK sono disponibili a partire dalla release NDK r22b. Nessuna API C++ esposta tramite l'NDK di Android. Alcune delle API C non sono disponibili.

Controllo delle versioni

Le release successive della piattaforma Android corrispondono alle versioni più recenti dell'ICU e alle versioni CLDR e Unicode corrispondenti. La Tabella 3 mostra questa corrispondenza a partire da Android 7.0 (livello API 24).

Tabella 3. Versioni ICU e CLDR utilizzate in Android 7.0 (livello API 24) e versioni successive.

Piattaforma (livello API) T.I. CLDR Unicode
Android 7.0-7.1 (livelli API 24-25) 56 28 con Android 8.0
Android 8.0-8.1 (livelli API 26-27) 58,2 30,0,3 9.0
Android 9 (livello API 28) 60,2 32.0.1 10,0
Android 10 (livello API 29) 63,2 34 11.0
Android 11 (livello API 30) 66,1 36 13,0
Android 12 (livello API 31) 68,2 38,1 13,0

Impostazione formato dell'ora 24/12 ore

ICU su Android non osserva l'impostazione del formato dell'ora 24/12 ore dell'utente, ottenuta da DateFormat.is24HourFormat(). Per osservare questa impostazione, utilizza i metodi di formattazione dell'ora DateFormat o DateUtils oppure pattern di formattazione dell'ora in T.I. con simboli appropriati per il modello dell'ora ("h" per 12 h, "H" per 24 h) per diversi valori restituiti di is24HourFormat(). Ad esempio, questo codice genera una stringa con l'ora corrente che osserva l'impostazione 12 ore/24 ore dell'utente:

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à di Transliterator

A partire da Android 10 (livello API 29), viene fornito Transliterator per traslitterare il testo da un formato all'altro. L'insieme di ID di traslitterazione disponibili è instabile in tutti i dispositivi e le release Android. I produttori di dispositivi potrebbero aggiungere ulteriori ID di traslitterazione. Gli sviluppatori devono controllare gli ID disponibili, ottenuti da Transliterator.getAvailableIDs(), prima di traslitterare il testo.

Gestione licenze

ICU4J è rilasciato con licenza ICU. Per maggiori dettagli, consulta la guida dell'utente per le ICU.