Поделиться через


Международные компоненты Для Юникода (ICU)

Международные компоненты для Юникода (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 или более поздней версии)

  1. Приложение должно быть предназначено для Windows 10 версии 1703 (Creators Update) или более поздней.

  2. Добавьте в заголовки:

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

    В Windows 10 версии 1709 и более поздних версий вместо этого следует включить объединенный заголовок:

    #include <icu.h>
    
  3. Ссылка на две библиотеки:

    • 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.

пример icu

Заметка

  • Это конфигурация для всех платформ.
  • Чтобы приложения 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);
}