Введение
Библиотека программного обеспечения 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.
International Components for Unicode (ICU) is an open source project of mature C/C++ and Java libraries for Unicode support, software internationalization, and software globalization. ICU is widely portable to many operating systems and environments. It gives applications the same results on all platforms and between C, C++, and Java software. The ICU project is a technical committee of the Unicode Consortium and sponsored, supported, and used by IBM and many other companies. ICU has been included as a standard component with Microsoft Windows since Windows 10 version 1703. ICU provides the following services: Unicode text handling, full character properties, and character set conversions; Unicode regular expressions; full Unicode sets; character, word, and line boundaries; language sensitive collation and searching; normalization, upper and lowercase conversion, and script transliterations; comprehensive locale data and resource bundle architecture via the Common Locale Data Repository (CLDR); multiple calendars and time zones; and rule based formatting and parsing of dates, times, numbers, currencies, and messages. ICU provided complex text layout service for Arabic, Hebrew, Indic, and Thai historically, but that was deprecated in version 54, and was completely removed in version 58 in favor of HarfBuzz. ICU provides more extensive internationalization facilities than the standard libraries for C and C++. Future ICU 75 planned for April 2024 will require C++17 (up from C++11) or C11 (up from C99), depending on what languages is used. ICU has historically used UTF 16, and still does only for Java; while for C/C++ UTF 8 is supported, including the correct handling of "illegal UTF 8". ICU 73.2 has improved significant changes for GB18030 2022 compliance support, i. e. for Chinese (that updated Chinese GB18030 Unicode Transformation Format standard is slightly incompatible); has "a modified character conversion table, mapping some GB18030 characters to Unicode characters that were encoded after GB18030 2005" and has a number of other changes such as improving Japanese and Korean short text line breaking, and in "English, the name “Türkiye” is now used for the country instead of “Turkey” (the alternate spelling is also available in the data)." ICU 74 "updates to Unicode 15.1, including new characters, emoji, security mechanisms, and corresponding APIs and implementations. [ ]
ICU 74 and CLDR 44 are major releases, including a new version of Unicode and major locale data improvements." Of the many changes some are for person name formatting, or for improved language support, e. g. for Low German, and there's e. g. a new spoof checker API, following the (latest version) 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++.