libunicode 0.9.0

Состоялся выпуск 0.9.0 библиотеки для языка C++ (стандарт C++20) libunicode. Проект разрабатывается командой разработчиков эмулятора терминала Contour и оболочки Endo (в активной разработке), и распространяется по лицензии Apache 2.0.
Возможности библиотеки:
поддержка стандартов Unicode 17.0:
- API для получения свойств Юникод;
- SIMD-оптимизация некоторых функций (с использованием
std::simdилиstd::experimental::simdпри их наличии); - оптимизированное конвертирование UTF-8 <-> UTF-16/UTF-32;
- эквивалент функции
wcwidth(int unicode::width(char32_t)); - сегментирование текста по графемам, символам, эмодзи и письменностям;
- преобразование регистра и сравнение строк;
- высокоуровневый API сегментирования текста, подходящий для реализации шейпинга текста.
- покрытие тестами большинства возможностей библиотеки (ширина символа и сегментирование).
В комплект поставки также входит консольная утилита unicode-query для получения подробной информации о строках.
Изменения:
- добавлен API
grapheme_cluster_width; - улучшения в работе с версиями Юникод («Age»);
- полная поддержка UAX #15 Unicode Normalization Forms с поддержкой поточной обработки:
normalizer norm(Normalization_Form::NFC);
// Feed decomposed e + combining acute, then a new starter to trigger emission
auto result = norm.feed(U'e');
CHECK(result.empty()); // still buffering
result = norm.feed(U'\u0301');
CHECK(result.empty()); // still buffering (combining mark)
result = norm.feed(U'x'); // starter triggers emission of previous segment
REQUIRE_FALSE(result.empty());
CHECK(result == U"\u00E9"); // e + acute composed to e-acute
result = norm.flush();
CHECK(result == U"x"); // final segment
- функция
script_extensionsтеперь возвращаетstd::optional>; - реализовано правило GB9c разбиения групп графем для сочетаний символов в языках группы Indic;
- в
grapheme_segmenterисправлены правила для GB11 и GB4/GB5; удалён устаревший API; - реализовано SIMD-оптимизированное конвертирование UTF-8 в UTF-16/UTF-32;
- ширина соединяющих символов Hangul V/T теперь равна нулю;
- реализовано сегментирование по границам слов;
- исправления в C API;
- рефакторинг системы сборки и вспомогательного генератора таблиц C++;
- добавлены комплексные тесты по преобразованию UTF-16/UTF-32;
- в CI добавлена статическая сборка утилиты
unicode-query.
>>> Подробности на GitHub
