Internationale Komponenten für Unicode (ICU)

International Components for Unicode (ICU) ist ein ausgereifter, weit verbreiteter Satz von Open-Source-Globalisierungs-APIs. ICU nutzt das umfangreiche Common Locale Data Repository (CLDR) von Unicode als Datenbibliothek und bietet Globalisierungsunterstützung für Softwareanwendungen. ICU ist weit verbreitet portabel und bietet Anwendungen auf allen Plattformen die gleichen Ergebnisse.

Highlights der von ICU bereitgestellten Globalisierungs-API-Dienste

  • Codepagekonvertierung: Konvertieren Sie Textdaten in oder aus Unicode und fast jeden anderen Zeichensatz oder jede andere Codierung. Die Konvertierungstabellen von ICU basieren auf Zeichensatzdaten, die von IBM im Laufe vieler Jahrzehnte gesammelt wurden, und sind die vollständigste, die überhaupt verfügbar ist.
  • Sortierung: Vergleichen Sie Zeichenfolgen gemäß den Konventionen und Standards einer bestimmten Sprache, Region oder eines bestimmten Landes. Die Sortierung der ICU basiert auf dem Unicode-Sortierungsalgorithmus und gebietsschemaspezifischen Vergleichsregeln aus CLDR.
  • Formatierung: Formatieren Sie Zahlen, Datumsangaben, Uhrzeiten und Währungsbeträge gemäß den Konventionen eines ausgewählten Gebietsschemas. Dies umfasst das Übersetzen von Monats- und Tagesnamen in die ausgewählte Sprache, die Auswahl entsprechender Abkürzungen, die korrekte Reihenfolge von Feldern usw. Diese Daten stammen auch aus dem Common Locale Data Repository.
  • Zeitberechnungen: Es werden mehrere Arten von Kalendern bereitgestellt, die über den herkömmlichen gregorianischen Kalender hinausgehen. Es werden umfassende APIs für die Zeitzonenberechnung bereitgestellt.
  • Unicode-Unterstützung: ICU verfolgt den Unicode-Standard genau nach und bietet einfachen Zugriff auf alle vielen Unicode-Zeicheneigenschaften, Unicode-Normalisierung, Fallfaltung und andere grundlegende Vorgänge, wie im Unicode-Standard angegeben.
  • Regulärer Ausdruck: Die regulären Ausdrücke von ICU unterstützen Unicode vollständig und bieten gleichzeitig eine sehr wettbewerbsfähige Leistung.
  • Bidi: Unterstützung für die Verarbeitung von Text, der eine Mischung aus Daten von links nach rechts (Englisch) und von rechts nach links (Arabisch oder Hebräisch) enthält.

Weitere Informationen finden Sie auf der ICU-Website: http://site.icu-project.org/

Übersicht

In Windows 10 Creators Update wurde die ICU in Windows integriert, sodass die C-APIs und -Daten öffentlich zugänglich sind.

Wichtig

Die Version der ICU in Windows macht nur die C-APIs verfügbar. Es macht keine der C++-APIs verfügbar. Leider ist es unmöglich, die C++-APIs je verfügbar zu machen, da in C++ keine stabile ABI vorhanden ist.

Eine Dokumentation zu den ICU C-APIs finden Sie auf der offiziellen Dokumentationsseite zur ICU: http://icu-project.org/apiref/icu4c/index.html#Module

Verlauf der Änderungen an der ICU-Bibliothek in Windows

Version 1703 (Creators Update)

Die ICU-Bibliothek wurde zuerst dem Windows 10 Betriebssystem in dieser Version hinzugefügt. Es wurde hinzugefügt wie:

  • Zwei System-DLLs:
    • icuuc.dll (dies ist die "allgemeine" Bibliothek der ICU)
    • icuin.dll (dies ist die i18n-Bibliothek der ICU)
  • Zwei Headerdateien im Windows 10 SDK:
    • icucommon.h
    • icui18n.h
  • Zwei Importlibs im Windows 10 SDK:
    • icuuc.lib
    • icuin.lib

Version 1709 (Fall Creators Update)

Eine kombinierte Headerdatei, icu.h, wurde hinzugefügt, die den Inhalt beider Headerdateien oben (icucommon.h und icui18n.h) enthält und auch den Typ von UCHAR in char16_tändert.

Version 1903 (Update vom Mai 2019)

Es wurde eine neue kombinierte DLL icu.dllhinzugefügt, die sowohl die Bibliotheken "common" als auch "i18n" enthält. Außerdem wurde dem Windows 10 SDK eine neue Importbibliothek hinzugefügt: icu.lib.

In Zukunft werden den alten Headern (icucommon.h und icui18n.h) oder den alten Importlibs (icuuc.lib und icuin.lib) keine neuen APIs hinzugefügt. Neue APIs werden nur dem kombinierten Header (icu.h) und der kombinierten Import-Lib (icu.lib) hinzugefügt.

Erste Schritte

Es müssen drei Standard Schritte ausgeführt werden: (Windows 10 Creators Update oder höher)

  1. Ihre Anwendung muss Windows 10 Version 1703 (Creators Update) oder höher als Ziel verwenden.

  2. Fügen Sie die Header hinzu:

    #include <icucommon.h>
    #include <icui18n.h>
    

    In Windows 10 Version 1709 und höher sollten Sie stattdessen den kombinierten Header einschließen:

    #include <icu.h>
    
  3. Link zu den beiden Bibliotheken:

    • icuuc.lib
    • icuin.lib

    Ab Windows 10 Version 1903 sollten Sie stattdessen die kombinierte Bibliothek verwenden:

    • icu.lib

Anschließend können Sie die gewünschte ICU-C-API aus diesen Bibliotheken aufrufen. (Es werden keine C++-APIs verfügbar gemacht.)

Wichtig

Wenn Sie die Legacy-Importbibliotheken icuuc.lib und icuin.lib verwenden, stellen Sie sicher, dass sie vor den Dachbibliotheken wie onecoreuap.lib oder WindowsApp.lib in der Einstellung Zusätzliche Abhängigkeiten Linker aufgeführt sind (siehe abbildung unten). Andernfalls wird der Linker mit icu.lib verknüpft, was zu einem Versuch führt, icu.dll während der Laufzeit zu laden. Diese DLL ist erst ab Version 1903 vorhanden. Wenn also ein Benutzer das Windows 10 SDK auf einem Windows-Computer vor Version 1903 aktualisiert, kann die App nicht geladen und ausgeführt werden. Einen Verlauf der ICU-Bibliotheken in Windows finden Sie unter Verlauf der Änderungen an der ICU-Bibliothek in Windows.

Beispiel

Hinweis

  • Dies ist die Konfiguration für "Alle Plattformen".
  • Damit Win32-Apps ICU verwenden können, müssen sie zuerst CoInitializeEx aufrufen. In Windows 10 Version 1903 und höher, wo die kombinierte ICU-Bibliothek (icu.dll/icu.lib) verfügbar ist, können Sie den CoInitializeEx-Aufruf mithilfe der kombinierten Bibliothek weglassen.
  • Nicht alle von ICU-APIs zurückgegebenen Daten entsprechen dem Windows-Betriebssystem, da diese Ausrichtungsarbeiten noch ausgeführt werden. 

ICU-Beispiel-App

Beispielcodeausschnitt

Im folgenden Beispiel wird die Verwendung von ICU-APIs in einer C++-UWP-Anwendung veranschaulicht. (Es ist nicht als vollständige eigenständige Anwendung vorgesehen, sondern nur ein Beispiel für das Aufrufen einer ICU-Methode.)

Im folgenden kleinen Beispiel wird davon ausgegangen, dass es die Methoden ErrorMessage und OutputMessage gibt, die die Zeichenfolgen in irgendeiner Weise an den Benutzer ausgeben.

// On Windows 10 Creators Update, include the following two headers. With Windows 10 Fall Creators Update and later, you can just include the single header <icu.h>.
#include <icucommon.h>
#include <icui18n.h>

void FormatDateTimeICU()
{
    UErrorCode status = U_ZERO_ERROR;

    // Create a ICU date formatter, using only the 'short date' style format.
    UDateFormat* dateFormatter = udat_open(UDAT_NONE, UDAT_SHORT, nullptr, nullptr, -1, nullptr, 0, &status);

    if (U_FAILURE(status))
    {
        ErrorMessage(L"Failed to create date formatter.");
        return;
    }

    // Get the current date and time.
    UDate currentDateTime = ucal_getNow();

    int32_t stringSize = 0;
    
    // Determine how large the formatted string from ICU would be.
    stringSize = udat_format(dateFormatter, currentDateTime, nullptr, 0, nullptr, &status);

    if (status == U_BUFFER_OVERFLOW_ERROR)
    {
        status = U_ZERO_ERROR;
        // Allocate space for the formatted string.
        auto dateString = std::make_unique<UChar[]>(stringSize + 1);

        // Format the date time into the string.
        udat_format(dateFormatter, currentDateTime, dateString.get(), stringSize + 1, nullptr, &status);

        if (U_FAILURE(status))
        {
            ErrorMessage(L"Failed to format the date time.");
            return;
        }

        // Output the formatted date time.
        OutputMessage(dateString.get());
    }
    else
    {
        ErrorMessage(L"An error occured while trying to determine the size of the formatted date time.");
        return;
    }

    // We need to close the ICU date formatter.
    udat_close(dateFormatter);
}