Состоялся выпуск 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<std::span<Script const>>;
- реализовано правило 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.
Источник: linux.org.ru
