Unterstützung für Unicode und Internationalisierung

Android nutzt die ICU-Bibliothek und das CLDR-Projekt, um Unicode und andere Internationalisierungsunterstützung zu bieten. Die Informationen zur Unterstützung von Unicode und der Internationalisierung sind auf dieser Seite in zwei Abschnitte unterteilt: Android 6.0 (API-Level 23) und niedriger und Android 7.0 (API-Level 24) und höher.

Unterstützung von Unicode und Internationalisierung über Android 6.0 (API-Level 23)

Die Android-Plattform verwendet ICU und CLDR, um verschiedene Klassen für die Verarbeitung sowohl lateinamerikanischer als auch nichtlateinischer Orthografien zu implementieren. Dabei werden Klassen wie Locale, Character und viele Unterklassen von java.text bereitgestellt. Eine App, die Internationalisierungsfunktionen über die gefährdeten Klassen hinaus erfordert und auf Versionen der Plattform über Android 6.0 (API-Level 23) ausgerichtet ist, muss die ICU-Bibliothek enthalten.

Versionsverwaltung

Aufeinanderfolgende Releases der Android-Plattform entsprechen neueren Versionen der ICU und den entsprechenden CLDR- und Unicode-Versionen. In Tabelle 1 wird dies über Android 6.0 (API-Level 23) dargestellt.

Tabelle 1 ICU- und CLDR-Versionen bis Android 6.0 (API-Level 23).

Plattform (API-Level) ITS CLDR-Bericht Unicode
Android 1.5–2.0 (API-Level 3–7) 3,8 1,5 5
Android 2.2 (API-Level 8) 4.2 1,7 5.1
Android 2.3–3.0 (API-Level 9–13) 4,4 1,8 5.2
Android 4.0 (API-Level 14–15) 4,6 1,9 6.0
Android 4.1 (API-Level 16 bis 17) 4,8 2 6.0
Android 4.3 (API-Level 18) 50 22,1 6.2
Android 4.4 (API-Level 19–20) 51 23 6.2
Android 5.0 (API-Level 21 bis 22) 53 25 6.3
Android 6.0 (API-Level 23) 55,1 27.0.1 7

Das Android-Framework bietet umfassendere Unterstützung für Unicode und Internationalisierung für Apps, die auf Android 7.0 (API-Level 24) und höher ausgerichtet sind. Der nächste Abschnitt auf dieser Seite enthält Details zu dieser Unterstützung.

Unterstützung von Unicode und Internationalisierung ab Android 7.0 (API-Level 24)

Für Android 7.0 (API-Level 24) und höher stellt die Android-Plattform einen Teil der ICU4J-APIs für App-Entwickler zur Verwendung unter dem android.icu-Paket zur Verfügung. ICU4J ist ein weit verbreiteter Open-Source-Satz von Java-Bibliotheken, die Unicode- und Internationalisierungsunterstützung für Softwareanwendungen bieten.

Die ICU4J APIs verwenden Lokalisierungsdaten, die auf dem Gerät vorhanden sind. Infolgedessen können Sie die Auslastung Ihrer Anwendung reduzieren, indem Sie die ICU4J-Bibliotheken nicht in Ihre Anwendung kompilieren. Stattdessen können Sie sie im Framework aufrufen. In diesem Fall können Sie mehrere Versionen Ihres APK bereitstellen, damit Nutzer mit Android-Versionen unter Android 7.0 (API-Level 24) eine Version der App herunterladen können, die die ICU4J-Bibliotheken enthält.

Dieser Abschnitt beginnt mit einigen grundlegenden Informationen zu den Mindest-Android-API-Levels, die zur Unterstützung dieser Bibliotheken erforderlich sind. Anschließend wird erläutert, was Sie über die Android-spezifische Implementierung von ICU4J wissen müssen. Schließlich erfahren Sie, wie Sie die ICU4J APIs im Android-Framework verwenden.

ICU4J auf Android

Android stellt einen Teil der ICU4J APIs über das Paket android.icu statt über com.ibm.icu bereit. Einige ICU4J APIs werden vom Android-Framework nicht freigegeben, z. B. weil die APIs verworfen oder nicht für stabil erklärt wurden. Da das ICU-Team APIs in Zukunft einstellt, werden sie von Android ebenfalls als verworfen markiert, werden aber weiterhin einbezogen.

Hier ein paar Hinweise:

  • Die ICU4J Android Framework APIs enthalten nicht alle ICU4J APIs.
  • Die APIs im Android-Framework ersetzen nicht die Unterstützung von Android für die Lokalisierung mit Ressourcen.
  • In einigen Fällen unterstützt das Android-Framework mehr Zeichen als die ICU-Bibliotheken. Dies trifft beispielsweise auf die Unterstützung der android.text-Klasse für Emojis zu.

Von com.ibm.icu zum Paket „android.icu“ migrieren

Wenn Sie in Ihrer Anwendung bereits die ICU4J APIs verwenden und die android.icu APIs Ihren Anforderungen entsprechen, müssen Sie für die Migration zu den Framework APIs Ihre Java-Importe von com.ibm.icu in android.icu ändern. Sie können dann Ihre eigene Kopie der ICU4J-Dateien aus der App entfernen.

Hinweis: Die ICU4J-Framework-APIs verwenden den Namespace android.icu anstelle von com.ibm.icu. Dadurch werden Namespace-Konflikte in Anwendungen vermieden, die eigene com.ibm.icu-Bibliotheken enthalten.

Von anderen Android SDK APIs zu android.icu APIs migrieren

Einige Klassen in den Paketen java und android haben Äquivalente zu denen in ICU4J. ICU4J bietet jedoch häufig umfassendere Unterstützung für Standards und Sprachen.

Tabelle 2 enthält einige Beispiele für diese Äquivalente, um Ihnen den Einstieg zu erleichtern:

Tabelle 2.Android- und Java-ICU4J-Klassen

Klasse Alternativen
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 auf Android

Android stellt einen Teil der ICU4C APIs über die libicu.so-Bibliothek statt über libicuuc.so oder libicui18n.so bereit. Die APIs sind ab Android 12 (API-Level 31) verfügbar. Die NDK-Header sind ab dem NDK-Release r22b verfügbar. Über den Android-NDK wird keine C++ API bereitgestellt. Einige der C APIs sind nicht verfügbar.

Versionsverwaltung

Aufeinanderfolgende Releases der Android-Plattform entsprechen neueren Versionen der ICU und den entsprechenden CLDR- und Unicode-Versionen. In Tabelle 3 ist dies ab Android 7.0 (API-Level 24) dargestellt.

Tabelle 3 ICU- und CLDR-Versionen, die unter Android 7.0 (API-Level 24) und höher verwendet werden.

Plattform (API-Level) ITS CLDR-Bericht Unicode
Android 7.0–7.1 (API-Level 24–25) 56 28 8.0
Android 8.0–8.1 (API-Level 26–27) 58,2 30.0.3 9.0
Android 9 (API-Level 28) 60,2 32.0.1 10
Android 10 (API-Level 29) 63,2 34 11.0
Android 11 (API-Level 30) 66,1 36 13
Android 12 (API-Level 31) 68,2 38,1 13

Einstellung für das 24-Stunden-/12-Stunden-Zeitformat

Die ICU unter Android berücksichtigt nicht die 24-Stunden-Zeitformateinstellung des Nutzers aus DateFormat.is24HourFormat(). Verwenden Sie entweder die Zeitformatierungsmethoden DateFormat oder DateUtils oder ICU-Zeitformatierungsmuster mit entsprechenden Stundenmustersymbolen („h“ für 12 Stunden, „H“ für 24 Stunden) für verschiedene is24HourFormat()-Rückgabewerte. Mit diesem Code wird beispielsweise eine Zeichenfolge mit der aktuellen Uhrzeit generiert, die die 12-Stunden-/24-Stunden-Einstellung des Nutzers berücksichtigt:

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ät des Transliterators

Ab Android 10 (API-Level 29) wird Transliterator zur Verfügung gestellt, um Text von einem Format in ein anderes zu transliterieren. Der Satz der verfügbaren Transkriptions-IDs ist bei allen Android-Releases und -Geräten instabil. Gerätehersteller fügen möglicherweise zusätzliche Transliterations-IDs hinzu. Entwickler müssen vor dem Transliterieren von Text die verfügbaren IDs aus Transliterator.getAvailableIDs() prüfen.

Lizenzen

ICU4J wird unter der ICU-Lizenz veröffentlicht. Weitere Informationen finden Sie im ICU-Nutzerhandbuch.