Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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)
Az alkalmazásnak meg kell céloznia a Windows 10 1703-at (Alkotók frissítése) vagy újabb verzióját.
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>
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.
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);
}