Compartilhar via


Componentes internacionais para Unicode (UTI)

Os Componentes Internacionais para Unicode (UTI) são um conjunto maduro e amplamente usado de APIs de globalização de software livre. A UTI 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: converter 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 padrões de um idioma, região ou país específico. A ordenação da UTI baseia-se no Algoritmo de Ordenação Unicode, além de regras de comparação específicas de localidade do CLDR.
  • Formatação: formatar números, datas, horários 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 UTI acompanha de perto o padrão Unicode, fornecendo acesso fácil a todas as muitas propriedades de caractere Unicode, Normalização Unicode, Dobramento de Maiúsculas 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, proporcionando 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, visite o site da UTI: http://site.icu-project.org/

Visão geral

No Windows 10 Creators Update, 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 documentação sobre as APIs de C da UTI, consulte a página oficial da documentação 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 dos Criadores)

A biblioteca de UTI 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)

Foi adicionada uma nova DLL combinada, icu.dll, que contém as bibliotecas "comum" 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 serão adicionadas apenas ao cabeçalho combinado (icu.h) e à lib de importação combinada (icu.lib).

Introdução

Há três etapas principais a seguir: (Windows 10 Creators Update ou superior)

  1. Seu aplicativo precisa ter como destino o Windows 10 Versão 1703 (Atualização para Criadores) 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 de 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 de guarda-chuva, como onecoreuap.lib ou WindowsApp.lib, na configuração do 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 UTI no Windows, consulte Histórico de alterações na biblioteca de UTI no Windows.

exemplo de UTI

Nota

  • Essa é a configuração de "Todas as Plataformas".
  • Para que os aplicativos Win32 usem a UTI, 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 UTI serão alinhados com o sistema operacional Windows, pois esse trabalho de alinhamento ainda está em andamento. 

Aplicativo de exemplo de UTI

Snippet de código de exemplo

Veja a seguir um exemplo que ilustra o uso de APIs de UCU de dentro de um aplicativo UWP C++. (Não se destina a ser um aplicativo autônomo completo, em vez disso, é apenas um exemplo de chamar um método de UTI.)

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