International Components for Unicode (ICU)

International Components for Unicode (ICU) è un set maturo e ampiamente usato di API di globalizzazione open source. L'ICU usa l'ampio Common Locale Data Repository (CLDR) di Unicode come libreria di dati, fornendo il supporto per la globalizzazione per le applicazioni software. L'ICU è ampiamente portabile e offre alle applicazioni gli stessi risultati in tutte le piattaforme.

Highlights of the Globalization API services provided by ICU

  • Conversione tabella codici: converte i dati di testo da o verso Unicode e quasi qualsiasi altro set di caratteri o codifica. Le tabelle di conversione dell'ICU si basano sui dati del set di caratteri raccolti da IBM nel corso di molti decenni ed è il più completo disponibile ovunque.
  • Regole di confronto: confrontare le stringhe in base alle convenzioni e agli standard di una determinata lingua, area geografica o paese. Le regole di confronto dell'ICU si basano sull'algoritmo delle regole di confronto Unicode e sulle regole di confronto specifiche delle impostazioni locali di CLDR.
  • Formattazione: formattare numeri, date, ore e importi di valuta in base alle convenzioni delle impostazioni locali scelte. Ciò include la traduzione dei nomi dei mesi e dei giorni nella lingua selezionata, la scelta delle abbreviazioni appropriate, l'ordinamento corretto dei campi e così via. Questi dati provengono anche dal repository dei dati delle impostazioni locali comuni.
  • Calcoli temporali: più tipi di calendari vengono forniti oltre il gregoriano tradizionale. Vengono fornite un set completo di API di calcolo del fuso orario.
  • Supporto Unicode: L'ICU tiene traccia attentamente dello standard Unicode, offrendo un facile accesso a tutte le numerose proprietà di caratteri Unicode, normalizzazione Unicode, riduzione del case e altre operazioni fondamentali, come specificato dallo standard Unicode.
  • Espressione regolare: le espressioni regolari dell'ICU supportano completamente Unicode, offrendo prestazioni molto competitive.
  • Bidi: supporto per la gestione del testo contenente una combinazione di dati da sinistra a destra (inglese) e da destra a sinistra (arabo o ebraico).

Per altre informazioni, è possibile visitare il sito Web dell'ICU: http://site.icu-project.org/

Panoramica

In Windows 10 Creators Update l'ICU è stata integrata in Windows, rendendo accessibili pubblicamente le API e i dati C.

Importante

La versione di ICU in Windows espone solo le API C. Non espone alcuna API C++. Purtroppo, è impossibile esporre le API C++ a causa della mancanza di un'ABI stabile in C++.

Per la documentazione sulle API di ICU C, vedere la documentazione ufficiale dell'ICU qui: http://icu-project.org/apiref/icu4c/index.html#Module

Cronologia delle modifiche apportate alla libreria di ICU in Windows

Versione 1703 (Creators Update)

La libreria di ICU è stata aggiunta per la prima volta al sistema operativo Windows 10 in questa versione. È stato aggiunto come segue:

  • Due DLL di sistema:
    • icuuc.dll (si tratta della libreria "comune" di ICU)
    • icuin.dll (si tratta della libreria ICU "i18n")
  • Due file di intestazione in Windows 10 SDK:
    • icucommon.h
    • icui18n.h
  • Due librerie di importazione in Windows 10 SDK:
    • icuuc.lib
    • icuin.lib

Versione 1709 (Fall Creators Update)

È stato aggiunto un file di intestazione combinato, icu.h, che contiene il contenuto di entrambi i file di intestazione precedenti (icucommon.h e icui18n.h) e modifica anche il tipo di UCHARchar16_tin .

Versione 1903 (aggiornamento di maggio 2019)

È stata aggiunta una nuova DLL combinata, icu.dll, che contiene sia le librerie "comuni" che "i18n". È stata inoltre aggiunta una nuova libreria di importazione all'SDK di Windows 10: icu.lib.

In futuro, non verranno aggiunte nuove API alle intestazioni precedenti (icucommon.h e icui18n.h) o alle librerie di importazione precedenti (icuuc.lib e icuin.lib). Le nuove API verranno aggiunte solo all'intestazione combinata (icu.h) e alla libreria di importazione combinata (icu.lib).

Introduzione

Esistono tre passaggi principali da seguire: (Windows 10 Creators Update o versione successiva)

  1. L'applicazione deve avere come destinazione Windows 10 versione 1703 (Creators Update) o successiva.

  2. Aggiungere nelle intestazioni:

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

    In Windows 10 versione 1709 e successive, è necessario includere invece l'intestazione combinata:

    #include <icu.h>
    
  3. Collegamento alle due librerie:

    • icuuc.lib
    • icuin.lib

    In Windows 10 versione 1903 e successive è consigliabile usare invece la libreria combinata:

    • icu.lib

È quindi possibile chiamare qualsiasi API di ICU C da queste librerie desiderate. Non sono esposte API C++.

Importante

Se si usano le librerie di importazione legacy, icuuc.lib e icuin.lib, assicurarsi che siano elencate prima delle librerie umbrella, ad esempio onecoreuap.lib o WindowsApp.lib, nell'impostazione Linker dipendenze aggiuntive (vedere l'immagine seguente). In caso contrario, il linker verrà collegato a icu.lib, che comporterà un tentativo di caricare icu.dll durante l'esecuzione. Tale DLL è presente solo a partire dalla versione 1903. Pertanto, se un utente aggiorna l'SDK di Windows 10 in un computer Windows precedente alla versione 1903, l'app non verrà caricata ed eseguita. Per una cronologia delle librerie di ICU in Windows, vedere Cronologia delle modifiche apportate alla libreria di ICU in Windows.

Esempio di icu

Nota

  • Questa è la configurazione per "Tutte le piattaforme".
  • Per consentire alle app Win32 di usare l'ICU, è prima necessario chiamare CoInitializeEx . In Windows 10 versione 1903 e successive, in cui è disponibile la libreria di ICU combinata (icu.dll/icu.lib), è possibile omettere la chiamata CoInitializeEx usando la libreria combinata.
  • Non tutti i dati restituiti dalle API di ICU saranno allineati al sistema operativo Windows, perché questo lavoro di allineamento è ancora in corso. 

App di esempio di ICU

Frammento di codice di esempio

Di seguito è riportato un esempio che illustra l'uso delle API ICU dall'interno di un'applicazione UWP C++. Non è destinato a essere un'applicazione autonoma completa, ma è solo un esempio di chiamata a un metodo di ICU.

Nell'esempio seguente si presuppone che siano presenti metodi ErrorMessage e OutputMessage che restituiscono le stringhe all'utente in qualche modo.

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