Freigeben über


Internationale Komponenten für Unicode (ICU)

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

Highlights der Globalisierungs-API-Dienste, die von der ICU bereitgestellt werden

  • Codeseitenkonvertierung: Konvertieren von Textdaten in oder aus Unicode und nahezu alle anderen Zeichensätze oder Codierungen. Die Konvertierungstabellen von ICU basieren auf charset-Daten, die von IBM im Laufe vieler Jahrzehnte gesammelt werden, und ist überall die vollständigste verfügbar.
  • 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 sowie gebietsschemaspezifischen Vergleichsregeln von CLDR.
  • Formatierung: Formatieren von Zahlen, Datumsangaben, Uhrzeiten und Währungsbeträgen gemäß den Konventionen eines ausgewählten Gebietsschemas. Dazu gehört das Übersetzen von Monats- und Tagesnamen in die ausgewählte Sprache, die Auswahl geeigneter Abkürzungen, das richtige Sortieren von Feldern usw. Diese Daten stammen auch aus dem gemeinsamen Gebietsschemadaten-Repository.
  • Zeitberechnungen: Mehrere Kalendertypen werden über den traditionellen Gregorianischen hinaus bereitgestellt. Eine gründliche Reihe von Zeitzonenberechnungs-APIs werden 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 durch die Unicode Standardangegeben.
  • 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 mit einer Mischung aus links nach rechts (Englisch) und von rechts nach links (Arabisch oder Hebräisch) Daten.

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

Überblick

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

Wichtig

Die Version der ICU in Windows macht nur die C-APIs verfügbar. Sie macht keine der C++-APIs verfügbar. Leider ist es unmöglich, die C++-APIs aufgrund des Fehlens einer stabilen ABI in C++ jemals verfügbar zu machen.

Dokumentation zu den ICU-C-APIs finden Sie auf der offiziellen ICU-Dokumentationsseite hier: 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 zunächst dem Windows 10-Betriebssystem in dieser Version hinzugefügt. Sie wurde hinzugefügt als:

  • Zwei System-DLLs:
    • icuuc.dll (dies ist die "allgemeine" ICU-Bibliothek)
    • icuin.dll (dies ist die ICU "i18n"-Bibliothek)
  • Zwei Headerdateien im Windows 10 SDK:
    • icucommon.h
    • icui18n.h
  • Zwei Import-Libs 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)

Eine neue kombinierte DLL, icu.dll, wurde hinzugefügt, die sowohl die "allgemeinen" als auch die "i18n"-Bibliotheken 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 Import libs (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 gibt drei Hauptschritte, die Sie ausführen müssen: (Windows 10 Creators Update oder höher)

  1. Ihre Anwendung muss auf Windows 10 Version 1703 (Creators Update) oder höher abzielen.

  2. Fügen Sie die Kopfzeilen hinzu:

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

    Unter 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

    Unter Windows 10, Version 1903 und höher, 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 Legacyimportbibliotheken, icuuc.lib und icuin.lib verwenden, stellen Sie sicher, dass sie vor den Dachbibliotheken wie onecoreuap.lib oder WindowsApp.lib in der Einstellung "Additional Dependencies 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 nur ab Version 1903 vorhanden. Wenn ein Benutzer also 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.

icu-Beispiel

Anmerkung

  • Dies ist die Konfiguration für "Alle Plattformen".
  • Damit Win32-Apps ICU verwenden können, müssen sie zuerst CoInitializeEx- aufrufen. Unter 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 über die kombinierte Bibliothek weglassen.
  • Nicht alle von ICU-APIs zurückgegebenen Daten werden am Windows-Betriebssystem ausgerichtet, da diese Ausrichtung noch ausgeführt wird. 

ICU-Beispiel-App

Beispielcodeausschnitt

Im Folgenden sehen Sie ein Beispiel für die Verwendung von ICU-APIs aus einer C++-UWP-Anwendung. (Es ist nicht beabsichtigt, eine vollständige eigenständige Anwendung zu sein, sondern nur ein Beispiel für das Aufrufen einer ICU-Methode.)

Im folgenden kleinen Beispiel wird davon ausgegangen, dass es Methoden ErrorMessage- und OutputMessage- gibt, die die Zeichenfolgen auf irgendeine 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);
}