Введение

Библиотека программного обеспечения International Components for Unicode (ICU) — это проект с открытым исходным кодом, включающий в себя зрелые библиотеки C/C++ и Java для поддержки Unicode, интернационализации и глобализации программного обеспечения. ICU обладает широкой переносимостью на различные операционные системы и среды. Она обеспечивает приложениям одинаковые результаты на всех платформах и при использовании программного обеспечения на C, C++ и Java. Проект ICU является техническим комитетом Консорциума Unicode и спонсируется, поддерживается и используется компаниями IBM и многими другими. ICU включена в состав Microsoft Windows в качестве стандартного компонента, начиная с версии Windows 10 1703. ICU предоставляет следующие сервисы: обработка текста Unicode, полные свойства символов и преобразование кодировок; регулярные выражения Unicode; полные наборы Unicode; определение границ символов, слов и строк; сортировка и поиск с учетом языковых особенностей; нормализация, преобразование регистра и транслитерация сценариев; комплексная архитектура локальных данных и пакетов ресурсов через Common Locale Data Repository (CLDR); поддержка множества календарей и часовых поясов; а также форматирование и разбор дат, времени, чисел, валют и сообщений на основе правил. Ранее ICU предоставляла сервис сложной компоновки текста для арабского, иврита, индийских и тайских языков, но он был объявлен устаревшим в версии 54 и полностью удален в версии 58 в пользу HarfBuzz. ICU предоставляет более широкие возможности интернационализации, чем стандартные библиотеки C и C++. Будущий релиз ICU 75, запланированный на апрель 2024 года, потребует C++17 (вместо C++11) или C11 (вместо C99), в зависимости от используемого языка. Исторически ICU использовала UTF-16, и продолжает использовать её для Java; в то время как для C/C++ поддерживается UTF-8, включая корректную обработку "некорректной UTF-8". ICU 73.2 внесла значительные изменения для обеспечения соответствия стандарту GB18030 2022, то есть для китайского языка (обновленный китайский стандарт формата преобразования в Unicode GB18030 незначительно несовместим); включает в себя "модифицированную таблицу преобразования символов, сопоставляющую некоторые символы GB18030 с символами Unicode, которые были закодированы после GB18030 2005 года", а также ряд других изменений, таких как улучшение переноса коротких текстовых строк в японском и корейском языках, и, например, "в английском языке для обозначения страны теперь используется название Türkiye вместо Turkey (альтернативное написание также доступно в данных)". ICU 74 "обновляет Unicode до версии 15.1, включая новые символы, эмодзи, механизмы безопасности, а также соответствующие API и реализации. [ ] ICU 74 и CLDR 44 — это основные релизы, включающие новую версию Unicode и значительные улучшения локальных данных". Среди множества изменений некоторые касаются форматирования имен людей или улучшения языковой поддержки, например, для нижненемецкого языка, а также добавлен новый API для проверки спуфинга, соответствующий (последней версии) Unicode 15.1.0 UTS #39: Unicode Security Mechanism.

Сведения о более ранних версиях

ICU 72 обновлен до Unicode 15 (и 73.2 до последней 15.1). "Во многих шаблонах форматирования символы пробела ASCII заменяются символами пробела Unicode (например, «тонким пробелом»). ICU (ICU4J) теперь требует Java 8, но «большая часть кода библиотеки ICU 72 должна по-прежнему работать с Java 7 / Android API уровня 21, однако мы больше не проводим тестирование с Java 7». ICU 71 добавил, например, разрыв строки на основе фраз для японского языка (ранее использованные методы плохо работали с коротким японским текстом, например, в названиях и заголовках) и поддержку хинди, записанного латинскими буквами (hi Latn), также известного как «Хинглиш». ICU 70 добавил, например, поддержку свойств эмодзи строк и теперь может быть собран и использован с компиляторами C++20 (и «функции ICU operator== и operator!= теперь возвращают bool вместо UBool, в качестве корректировки на несовместимые изменения в C++20»), а начиная с этой версии минимальной версией Windows является Windows 7. ICU 67 обрабатывает выход Великобритании из ЕС. ICU 64.2 добавил поддержку Unicode 12.1, то есть единственный новый символ для текущей японской эры Рейва (но поддержка также была портирована в более старые версии ICU, начиная с ICU 4.8.2). ICU 58 (с поддержкой Unicode 9.0) — последняя версия, поддерживающая устаревшие платформы, такие как Windows XP и Windows Vista. Поддержка AIX, Solaris и z/OS также может быть ограничена в более поздних версиях (то есть сборка зависит от поддержки компилятора).

Происхождение и развитие

После того, как Taligent стала частью IBM в начале 1996 года, Sun Microsystems решила, что новому языку Java необходима более качественная поддержка интернационализации. Поскольку Taligent обладала опытом в этой области и находилась неподалеку, их группу Text and International попросили внести классы интернационализации в Java Development Kit как часть API интернационализации JDK 1.1. Значительная часть этого кода до сих пор существует в пакетах `java.text` и `java.util`. Дополнительные функции интернационализации добавлялись с каждым последующим выпуском Java. Затем классы интернационализации Java были портированы на C++ и C в виде библиотеки, известной как ICU4C ("ICU для C"). Проект ICU также предоставляет ICU4J ("ICU для Java"), которая добавляет функции, отсутствующие в стандартных библиотеках Java. ICU4C и ICU4J очень похожи, но не идентичны; например, ICU4C включает API регулярных выражений, а ICU4J – нет. Обе эти платформы со временем были расширены для поддержки новых возможностей и новых функций Unicode и Common Locale Data Repository (CLDR). ICU была выпущена как проект с открытым исходным кодом в 1999 году под названием IBM Classes for Unicode. Позже она была переименована в International Components For Unicode. В мае 2016 года проект ICU присоединился к консорциуму Unicode в качестве технического комитета ICU TC, а исходный код библиотеки теперь распространяется под лицензией Unicode.

Формат сообщения

Частью ICU является класс MessageFormat — система форматирования, позволяющая использовать любое количество аргументов для управления формой множественного числа (,) или, в более общем случае, для выбора варианта по принципу оператора switch, например, для согласования по грамматическому роду. Эти конструкции могут быть вложены. ICU MessageFormat был создан на основе аналогичной системы в Java SE, к которой были добавлены поддержка форм множественного числа и выборки.

Альтернативы

Альтернативой использования ICU с C++ или непосредственной работы с ним является использование Boost.Locale, который представляет собой C++-оболочку для ICU (при этом допускающую и другие бэкенды). Утверждается, что использование Boost.Locale вместо прямой работы с ICU "абсолютно неудобно для C++ разработчиков. Он игнорирует распространенные идиомы C++ (STL, RTTI, исключения и т.п.), в основном имитируя Java API". Еще одно утверждение, что ICU поддерживает только UTF-16 (и, следовательно, является причиной избегать его использования), больше не актуально, поскольку ICU теперь также поддерживает UTF-8 для C и C++.