Megosztás a következőn keresztül:


Nemzetközi összetevők Unicode-hoz (ICU)

A Unicode nemzetközi összetevői (ICU) nyílt forráskódú globalizációs API-k kiforrott, széles körben használt készletei. Az ICU a Unicode hatalmas Common Locale Data Repository (CLDR) adattárát használja adattárként, amely globalizációs támogatást nyújt a szoftveralkalmazásokhoz. Az ICU széles körben hordozható, és minden platformon ugyanazokat az eredményeket nyújtja az alkalmazásoknak.

Az ICU által biztosított Globalization API-szolgáltatások főbb jellemzői

  • kódlapkonvertálási: Szöveges adatok konvertálása Unicode-ra vagy unicode-ra, illetve szinte bármilyen más karakterkészletre vagy kódolásra. Az ICU konverziós táblái az IBM által több évtized alatt gyűjtött charset-adatokon alapulnak, és a legösszetevőbbek bárhol.
  • rendezési: Egy adott nyelv, régió vagy ország konvencióinak és szabványainak megfelelően hasonlítsa össze a sztringeket. Az ICU rendezése a Unicode-rendezési algoritmuson, valamint a CLDR területi összehasonlítási szabályain alapul.
  • Formázási: Számok, dátumok, időpontok és pénznemösszegek formázása a választott területi beállítások konvenciók szerint. Ide tartozik a hónap- és napnevek lefordítása a kiválasztott nyelvre, a megfelelő rövidítések kiválasztása, a mezők helyes sorrendbe helyezése stb. Ezek az adatok a Common Locale Data Repository-ból is származnak.
  • időszámítások: A hagyományos Gergely-naptárakon kívül több naptártípus is rendelkezésre áll. Az időzóna-számítási API-k alapos készletét biztosítjuk.
  • Unicode támogatási: Az ICU szorosan nyomon követi a Unicode szabványt, így könnyen hozzáférhet a Unicode-karaktertulajdonságok, a Unicode normalizálása, a kis- és nagybetűk összecsukása és a Unicode Standardáltal meghatározott egyéb alapvető műveletekhez.
  • Regular Expression: Az ICU reguláris kifejezései teljes mértékben támogatják a Unicode-t, miközben nagyon versenyképes teljesítményt nyújtanak.
  • Bidi: A balról jobbra (angol) és a jobbról balra (arab vagy héber) adatok keverékét tartalmazó szövegek kezelésére szolgáló támogatás.

További információkért látogasson el az intenzív osztály webhelyére: http://site.icu-project.org/

Áttekintés

A Windows 10 Creators Update-ben az ICU integrálva lett a Windowsba, így a C API-k és az adatok nyilvánosan elérhetők.

Fontos

A Windows ICU verziója csak a C API-kat teszi elérhetővé. A C++ API-k egyikét sem teszi elérhetővé. Sajnos a C++ API-k soha nem tehetők elérhetővé, mivel nincs stabil ABI a C++-ban.

Az ICU C API-kkal kapcsolatos dokumentációt az ICU hivatalos dokumentációs oldalán találja: http://icu-project.org/apiref/icu4c/index.html#Module

A Windows ICU-kódtár módosításainak előzményei

1703-es verzió (alkotói frissítés)

Az ICU-kódtár először ebben a verzióban lett hozzáadva a Windows 10 operációs rendszerhez. A következő módon lett hozzáadva:

  • Két rendszer DLL-je:
    • icuuc.dll (ez az intenzív osztály "közös" könyvtára)
    • icuin.dll (ez az ICU "i18n" könyvtára)
  • Két fejlécfájl a Windows 10 SDK-ban:
    • icucommon.h
    • icui18n.h
  • Két importálási lib a Windows 10 SDK-ban:
    • icuuc.lib
    • icuin.lib

1709-es verzió (Fall Creators Update)

Hozzá lett adva egy kombinált fejlécfájl, icu.h, amely a fenti fejlécfájlok tartalmát tartalmazza (icucommon.h és icui18n.h), és a UCHAR típusát is char16_t.

1903-es verzió (2019. májusi frissítés)

Hozzáadtunk egy új, icu.dllnevű kombinált DLL-t, amely a "common" és az "i18n" kódtárat is tartalmazza. A Windows 10 SDK-hoz egy új importálási kódtárat is hozzáadtak: icu.lib.

A továbbiakban nem lesznek új API-k a régi fejlécekhez (icucommon.h és icui18n.h) vagy a régi importálási libekhez (icuuc.lib és icuin.lib). Az új API-k csak a kombinált fejléchez (icu.h) és az egyesített importálási libhez (icu.lib) lesznek hozzáadva.

Kezdetekhez

Három fő lépést kell követni: (Windows 10 Creators Update vagy újabb)

  1. Az alkalmazásnak meg kell céloznia a Windows 10 1703-at (Alkotók frissítése) vagy újabb verzióját.

  2. Hozzáadás a fejlécekhez:

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

    A Windows 10 1709-es vagy újabb verziójában a kombinált fejlécet kell tartalmaznia:

    #include <icu.h>
    
  3. Hivatkozás a két kódtárra:

    • icuuc.lib
    • icuin.lib

    A Windows 10 1903-es és újabb verzióiban inkább a kombinált kódtárat kell használnia:

    • icu.lib

Ezután bármilyen ICU C API-t meghívhat ezekből a kódtárakból. (Nincsenek C++ API-k.)

Fontos

Ha az örökölt importálási kódtárakat( icuuc.lib és icuin.lib) használja, győződjön meg arról, hogy az esernyőtárak ( például a onecoreuap.lib vagy a WindowsApp.lib) előtt szerepelnek a További függőségek hivatkozása beállításban (lásd az alábbi ábrát). Ellenkező esetben a linker az icu.lib-hez fog kapcsolódni, ami icu.dll futási idő alatt történő betöltését eredményezi. Ez a DLL csak az 1903-es verziótól kezdve van jelen. Ha tehát egy felhasználó frissíti a Windows 10 SDK-t egy 1903-es verzió előtti Windows-gépen, az alkalmazás betöltése és futtatása sikertelen lesz. A Windows ICU-kódtárainak előzményeit Az ICU-kódtár változásainak előzményei a Windows.

icu-példa

Jegyzet

  • Ez a "Minden platform" konfigurációja.
  • Ahhoz, hogy a Win32-alkalmazások használják az ICU-t, először meg kell hívniuk CoInitializeEx. A Windows 10 1903-es és újabb verzióiban, ahol a kombinált ICU-kódtár (icu.dll/icu.lib) elérhető, kihagyhatja a CoInitializeEx hívást a kombinált kódtár használatával.
  • Az ICU API-k által visszaadott adatok nem igazodnak a Windows operációs rendszerhez, mivel ez az igazítási munka még folyamatban van. 

ICU példaalkalmazás

Példakódrészlet

Az alábbi példa az ICU API-k használatát szemlélteti egy C++ UWP-alkalmazásból. (Ez nem egy teljes önálló alkalmazás, hanem csak egy példa egy ICU metódus meghívására.)

Az alábbi kis példa feltételezi, hogy vannak olyan metódusok, ErrorMessage és OutputMessage, amelyek valamilyen módon kimenetelik a sztringeket a felhasználónak.

// 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);
}