libunicode 0.9.0

500px.jpg

Состоялся выпуск 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

©  Linux.org.ru