Compatibilidade com Unicode e internacionalização

O Android utiliza a biblioteca ICU e o projeto CDLR (links em inglês) para oferecer suporte a Unicode e outras formas de internacionalização. Esta página sobre suporte a Unicode e internacionalização é dividida em duas seções: Android 6.0 (nível 23 da API) e versões anteriores e Android 7.0 (nível 24 da API) e versões mais recentes.

Suporte a Unicode e internacionalização até o Android 6.0 (nível 23 da API)

A plataforma Android usa ICU e CLDR para implementar várias classes para lidar com ortografias latinas e não latinas, expondo classes como Locale, Character e muitas subclasses de java.text. Os apps que exigem funcionalidades de internacionalização além das classes expostas e são direcionados ao Android 6.0 (nível 23 da API) e versões anteriores precisam incluir a biblioteca ICU.

Controle de versões

Versões seguintes da plataforma Android correspondem às versões mais recentes da ICU e às versões CLDR e Unicode correspondentes. A tabela 1 mostra essa correspondência até o Android 6.0 (nível 23 da API).

Tabela 1. Versões da ICU e CLDR usadas até o Android 6.0 (nível 23 da API).

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

O framework do Android oferece suporte mais abrangente para Unicode e internacionalização para apps direcionados ao Android 7.0 (nível 24 da API) e versões mais recentes. A próxima seção desta página apresenta detalhes sobre esse suporte.

Suporte a Unicode e internacionalização no Android 7.0 (nível 24 da API) ou mais recente

No Android 7.0 (nível 24 da API) e versões mais recentes, a plataforma Android expõe um subconjunto das APIs ICU4J para desenvolvedores de apps usarem no pacote android.icu. O ICU4J é um conjunto de bibliotecas Java de código aberto amplamente utilizado que fornece suporte para Unicode e internacionalização para aplicativos de software.

As APIs ICU4J usam dados de localização presentes no dispositivo. Como resultado, você pode não compilar as bibliotecas do ICU4J para reduzir a pegada do app. Em vez disso, basta fazer a chamada delas no framework. Se você fizer isso, convém fornecer várias versões do seu APK para que os usuários com versões anteriores ao Android 7.0 (nível 24 da API) possam fazer o download de uma versão do app que contenha as bibliotecas ICU4J.

Esta seção começa fornecendo algumas informações básicas sobre os níveis mínimos de API do Android necessários para oferecer suporte a essas bibliotecas. Em seguida, o documento explica o que você precisa saber sobre a implementação específica da ICU4J no Android. Por fim, ele informa como usar as APIs ICU4J no framework do Android.

ICU4J no Android

O Android expõe um subconjunto das APIs ICU4J pelo pacote android.icu, em vez do com.ibm.icu. Algumas APIs ICU4J descontinuadas ou que não foram declaradas estáveis não são expostas pelo framework do Android. Conforme a equipe da ICU descontinuar as APIs no futuro, o Android também as marcará como descontinuadas, mas ainda vão ser incluídas.

Confira alguns lembretes:

  • As APIs ICU4J do framework do Android não incluem todas as APIs ICU4J.
  • As APIs no framework do Android não substituem o suporte do Android para localização com recursos.
  • Em alguns casos, o framework do Android oferece suporte a mais caracteres do que as bibliotecas ICU. Isso acontece, por exemplo, no suporte da classe android.text para emojis.

Migrar para o pacote android.icu do com.ibm.icu

Se você já estiver usando as APIs ICU4J no seu app, e as APIs android.icu atenderem suas necessidades, a migração para as APIs do framework exige que você mude suas importações em Java de com.ibm.icu para android.icu. Em seguida, remova sua própria cópia dos arquivos ICU4J do APK.

Observação: as APIs ICU4J do framework usam o namespace android.icu em vez de com.ibm.icu. Isso acontece para evitar conflitos de namespace em APKs que contenham as próprias bibliotecas com.ibm.icu.

Migrar para APIs android.icu de outras APIs do SDK do Android

Algumas classes nos pacotes java e android têm equivalentes àquelas encontradas na ICU4J. A ICU4J geralmente oferece suporte mais abrangente para padrões e idiomas.

A Tabela 2 mostra alguns exemplos dessas equivalências para que você possa começar:

Tabela 2. Classes ICU4J do Android e do Java.

Classe. 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 no Android

O Android expõe um subconjunto das APIs ICU4C pela biblioteca libicu.so, em vez de libicuuc.so ou libicui18n.so. As APIs estão disponíveis no Android 12 (nível 31 da API) e versões mais recentes. Os cabeçalhos do NDK estão disponíveis a partir da versão r22b do NDK. Nenhuma API C++ é exposta pelo Android NDK. Algumas das APIs C ainda não estão disponíveis.

Controle de versões

Versões seguintes da plataforma Android correspondem às versões mais recentes da ICU e às versões CLDR e Unicode correspondentes. A Tabela 3 mostra essa correspondência no Android 7.0 (nível 24 da API) e versões mais recentes.

Tabela 3. Versões da ICU e CLDR usadas no Android 7.0 (nível 24 da API) ou mais recente.

Plataforma (nível de API) ICU CLDR Unicode
Android 7.0 - 7.1 (níveis 24 e 25 da API) 56 28 8.0
Android 8.0 - 8.1 (níveis 26 e 27 da API) 58.2 30.0.3 9.0
Android 9 (nível 28 da API) 60.2 32.0.1 10.0
Android 10 (nível 29 da API) 63.2 34 11.0
Android 11 (nível 30 da API) 66.1 36 13.0
Android 12 (nível 31 da API) 68.2 38.1 13.0

Configuração de formato de hora 24h/12h

A ICU no Android não observa a configuração de formato de 24h/12h do usuário, recebida de DateFormat.is24HourFormat(). Para observar essa configuração, use os métodos de formatação de hora DateFormat ou DateUtils ou use os padrões de formatação de tempo da ICU com símbolos de padrão de hora apropriados ("h" para 12h, "H" para 24h) para diferentes valores de retorno is24HourFormat(). Por exemplo, o código abaixo gera uma string com o horário atual que segue a configuração de 12h/24h do usuário:

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

Estabilidade da transliteração

No Android 10 (nível 29 da API) e versões mais recentes, o Transliterator é fornecido para transliterar textos de um formato para o outro. O conjunto de IDs de transliteração é instável em diferentes versões e dispositivos Android. Os fabricantes de dispositivos podem adicionar IDs de transliteração extras. Os desenvolvedores precisam verificar os IDs disponíveis, que vêm de Transliterator.getAvailableIDs(), antes de transliterar o texto.

Licenciamento

A ICU4J foi lançada sob a licença da ICU. Para mais detalhes, consulte o Guia do usuário da ICU (link em inglês).