ICU (Componentes Internacionais para Unicode)

A ICU (International Components for Unicode) é um conjunto maduro e amplamente utilizado de APIs de globalização de software livre. A ICU utiliza o vasto CLDR (Common Locale Data Repository) da Unicode como sua biblioteca de dados, fornecendo suporte à globalização para aplicativos de software. A UTI é amplamente portátil e fornece aos aplicativos os mesmos resultados em todas as plataformas.

Destaques dos serviços de API de Globalização fornecidos pela UTI

  • Conversão de página de código: converta dados de texto de ou para Unicode e quase qualquer outro conjunto de caracteres ou codificação. As tabelas de conversão da UTI são baseadas em dados de conjunto de caracteres coletados pela IBM ao longo de muitas décadas e são os mais completos disponíveis em qualquer lugar.
  • Ordenação: compare cadeias de caracteres de acordo com as convenções e os padrões de um determinado idioma, região ou país. A ordenação da UTI é baseada no Algoritmo de Ordenação Unicode mais regras de comparação específicas de localidade do CLDR.
  • Formatação: formatar números, datas, horas e valores de moeda de acordo com as convenções de uma localidade escolhida. Isso inclui traduzir nomes de mês e dia para o idioma selecionado, escolher abreviações apropriadas, ordenar campos corretamente etc. Esses dados também são provenientes do Repositório de Dados de Localidade Comum.
  • Cálculos de tempo: vários tipos de calendários são fornecidos além do gregoriano tradicional. Um conjunto completo de APIs de cálculo de fuso horário é fornecido.
  • Suporte unicode: a ICU acompanha de perto o padrão Unicode, fornecendo acesso fácil a todas as muitas propriedades de caractere Unicode, Normalização Unicode, Dobramento de Caso e outras operações fundamentais, conforme especificado pelo Unicode Standard.
  • Expressão regular: as expressões regulares da UTI dão suporte total ao Unicode, fornecendo um desempenho muito competitivo.
  • Bidi: suporte para manipulação de texto que contém uma mistura de dados da esquerda para a direita (inglês) e da direita para a esquerda (árabe ou hebraico).

Para obter mais informações, acesse o site da UTI: http://site.icu-project.org/

Visão geral

Em Atualização do Windows 10 para Criadores, a UTI foi integrada ao Windows, tornando as APIs C e os dados publicamente acessíveis.

Importante

A versão da UTI no Windows expõe apenas as APIs C. Ele não expõe nenhuma das APIs do C++. Infelizmente, é impossível expor as APIs do C++ devido à falta de uma ABI estável no C++.

Para obter a documentação sobre as APIs C da UTI, consulte a página de documentação oficial da UTI aqui: http://icu-project.org/apiref/icu4c/index.html#Module

Histórico de alterações na biblioteca de UTI no Windows

Versão 1703 (Atualização para Criadores)

A biblioteca de ICU foi adicionada pela primeira vez ao sistema operacional Windows 10 nesta versão. Ele foi adicionado como:

  • Duas DLLs do sistema:
    • icuuc.dll (esta é a biblioteca "comum" da UTI)
    • icuin.dll (esta é a biblioteca "i18n" da UTI)
  • Dois arquivos de cabeçalho no SDK do Windows 10:
    • icucommon.h
    • icui18n.h
  • Duas libs de importação no SDK do Windows 10:
    • icuuc.lib
    • icuin.lib

Versão 1709 (Fall Creators Update)

Um arquivo de cabeçalho combinado, icu.h, foi adicionado, que contém o conteúdo de ambos os arquivos de cabeçalho acima (icucommon.h e icui18n.h) e também altera o tipo de UCHAR para char16_t.

Versão 1903 (Atualização de maio de 2019)

Uma nova DLL combinada, icu.dll, foi adicionada, que contém as bibliotecas "comuns" e "i18n". Além disso, uma nova biblioteca de importação foi adicionada ao SDK do Windows 10: icu.lib.

Daqui para frente, nenhuma nova APIs será adicionada aos cabeçalhos antigos (icucommon.h e icui18n.h) ou às antigas libs de importação (icuuc.lib e icuin.lib). Novas APIs só serão adicionadas ao cabeçalho combinado (icu.h) e à lib de importação combinada (icu.lib).

Introdução

Há três main etapas a seguir: (Atualização do Windows 10 para Criadores ou superior)

  1. Seu aplicativo precisa ter como destino Windows 10 versão 1703 (Atualização do Criador) ou superior.

  2. Adicione os cabeçalhos:

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

    No Windows 10 versão 1709 e superior, você deve incluir o cabeçalho combinado em vez disso:

    #include <icu.h>
    
  3. Link para as duas bibliotecas:

    • icuuc.lib
    • icuin.lib

    No Windows 10 versão 1903 e superior, você deve usar a biblioteca combinada em vez disso:

    • icu.lib

Em seguida, você pode chamar qualquer API C da UTI dessas bibliotecas desejadas. (Nenhuma APIs C++ é exposta.)

Importante

Se você estiver usando as bibliotecas de importação herdadas, icuuc.lib e icuin.lib, verifique se elas estão listadas antes das bibliotecas do guarda-chuva, como onecoreuap.lib ou WindowsApp.lib, na configuração Vinculador de Dependências Adicionais (consulte a imagem abaixo). Caso contrário, o vinculador vinculará a icu.lib, o que resultará em uma tentativa de carregar icu.dll durante o tempo de execução. Essa DLL está presente apenas a partir da versão 1903. Portanto, se um usuário atualizar o SDK do Windows 10 em um computador Windows pré-versão 1903, o aplicativo falhará ao carregar e executar. Para obter um histórico das bibliotecas de ICU no Windows, consulte Histórico de alterações na biblioteca da UTI no Windows.

Exemplo de UTI

Observação

  • Essa é a configuração de "Todas as Plataformas".
  • Para que os aplicativos Win32 usem a ICU, eles precisam chamar CoInitializeEx primeiro. No Windows 10 versão 1903 e superior, em que a biblioteca de UTI combinada (icu.dll/icu.lib) está disponível, você pode omitir a chamada CoInitializeEx usando a biblioteca combinada.
  • Nem todos os dados retornados pelas APIs de ICU serão alinhados com o sistema operacional Windows, pois esse trabalho de alinhamento ainda está em andamento. 

Aplicativo de exemplo de UTI

Exemplo de snippet de código

Veja a seguir um exemplo que ilustra o uso de APIs de ICU de dentro de um aplicativo UWP do C++. (Ele não se destina a ser um aplicativo autônomo completo, mas é apenas um exemplo de chamar um método de ICU.)

O pequeno exemplo a seguir pressupõe que há métodos ErrorMessage e OutputMessage que geram as cadeias de caracteres para o usuário de alguma maneira.

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