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)
Seu aplicativo precisa ter como destino Windows 10 versão 1703 (Atualização do Criador) ou superior.
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>
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.
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);
}