libunicode 0.9.0

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

Добавить комментарий