Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Международные компоненты для Юникода (ICU) — это зрелый, широко используемый набор API глобализации с открытым кодом. ICU использует огромный репозиторий общих языковых стандартов Юникода (CLDR) в качестве своей библиотеки данных, обеспечивая поддержку глобализации для приложений программного обеспечения. ICU широко переносим и предоставляет приложениям одинаковые результаты на всех платформах.
Основные сведения о службах API глобализации, предоставляемых ICU
- преобразование кодовой страницы: преобразование текстовых данных в Юникод или практически из любого другого набора символов или кодировки. Таблицы преобразования ICU основаны на данных charset, собранных IBM на протяжении многих десятилетий, и является самым полным в любом месте.
- сортировки. Сравнение строк в соответствии с соглашениями и стандартами определенного языка, региона или страны. Параметры сортировки ICU основаны на алгоритме сортировки Юникода и правилах сравнения для конкретного языкового стандарта из СРЕДЫ CLDR.
- форматирование: формат чисел, дат, времени и денежных сумм в соответствии с соглашениями выбранного языкового стандарта. Это включает перевод имен месяцев и дней на выбранный язык, выбор соответствующих сокращений, правильное упорядочивание полей и т. д. Эти данные также приходят из репозитория общих данных языкового стандарта.
- вычисления времени: несколько типов календарей предоставляются за пределами традиционного григорианского. Предоставляется подробный набор API вычислений часового пояса.
- поддержке Юникода: ICU внимательно отслеживает стандарт Юникода, предоставляя простой доступ ко всем свойствам символов Юникода, нормализации юникода, сворачиванию регистров и другим основным операциям, указанным в Стандартный юникод.
- регулярных выражений: регулярные выражения ICU полностью поддерживают Юникод, обеспечивая высокую конкурентоспособную производительность.
- Bidi: поддержка обработки текста, содержащего смесь левого направо (английский) и справа налево (арабский или иврит).
Дополнительные сведения см. на веб-сайте ICU: http://site.icu-project.org/
Обзор
В Windows 10 Creators Update ICU интегрирован в Windows, что делает API C и данные общедоступными.
Важный
Версия ICU в Windows предоставляет только API C. Он не предоставляет ни один из API C++. К сожалению, невозможно когда-либо предоставлять API C++ из-за отсутствия стабильного ABI в C++.
Документация по API C ICU см. на официальной странице документации по ICU: http://icu-project.org/apiref/icu4c/index.html#Module
Журнал изменений библиотеки ICU в Windows
Версия 1703 (Creators Update)
Библиотека ICU была впервые добавлена в ОС Windows 10 в этой версии. Он был добавлен следующим образом:
- Две системные библиотеки DLL:
- icuuc.dll (это "общая" библиотека ICU)
- icuin.dll (это библиотека ICU i18n)
- Два файла заголовка в пакете SDK для Windows 10:
- icucommon.h
- icui18n.h
- Два импорта libs в пакете SDK для Windows 10:
- icuuc.lib
- icuin.lib
Версия 1709 (Fall Creators Update)
Добавлен объединенный файл заголовка icu.h, который содержит содержимое обоих файлов заголовков выше (icucommon.h и icui18n.h), а также изменяет тип UCHAR
на char16_t
.
Версия 1903 (обновление за май 2019 г.)
Добавлена новая объединенная библиотека DLL, icu.dll, которая содержит библиотеки common и i18n. Кроме того, в пакет SDK для Windows 10 добавлена новая библиотека импорта: icu.lib.
В дальнейшем новые API-интерфейсы не будут добавлены к старым заголовкам (icucommon.h и icui18n.h) или к старым библиотекам импорта (icuuc.lib и icuin.lib). Новые API будут добавлены только в объединенный заголовок (icu.h) и объединенное lib импорта (icu.lib).
Начало работы
Ниже приведены три основных шага: (Windows 10 Creators Update или более поздней версии)
Приложение должно быть предназначено для Windows 10 версии 1703 (Creators Update) или более поздней.
Добавьте в заголовки:
#include <icucommon.h> #include <icui18n.h>
В Windows 10 версии 1709 и более поздних версий вместо этого следует включить объединенный заголовок:
#include <icu.h>
Ссылка на две библиотеки:
- icuuc.lib
- icuin.lib
В Windows 10 версии 1903 и выше следует использовать объединенную библиотеку.
- icu.lib
Затем вы можете вызвать любой API CCU из этих библиотек. (Api C++ не предоставляются.)
Важный
Если вы используете устаревшие библиотеки импорта, icuuc.lib и icuin.lib, убедитесь, что они перечислены перед библиотеками зонтов, например onecoreuap.lib или WindowsApp.lib, в параметре Компоновщика дополнительных зависимостей (см. изображение ниже). В противном случае компоновщик будет ссылаться на icu.lib, что приведет к попытке загрузить icu.dll во время выполнения. Эта библиотека DLL присутствует только с версии 1903. Таким образом, если пользователь обновляет пакет SDK для Windows 10 на компьютере с Windows до версии 1903, приложение не сможет загрузить и запустить его. Журнал библиотек ICU в Windows см. в разделе журнал изменений библиотеки ICU в Windows.
пример
Заметка
- Это конфигурация для всех платформ.
- Чтобы приложения Win32 использовали ICU, сначала необходимо вызвать CoInitializeEx. В Windows 10 версии 1903 и выше, где доступна объединенная библиотека ICU (icu.dll/icu.lib), можно опустить вызов CoInitializeEx с помощью объединенной библиотеки.
- Не все данные, возвращаемые API-интерфейсами ICU, будут соответствовать ОС Windows, так как эта работа по выравниванию по-прежнему выполняется.
Пример приложения ICU
Пример фрагмента кода
Ниже приведен пример использования API ICU из приложения UWP C++. (Это не предназначено для полного автономного приложения, а это просто пример вызова метода ICU.)
В следующем небольшом примере предполагается, что существуют методы ErrorMessage и OutputMessage, которые выводят строки пользователю каким-то образом.
// 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);
}