LINUX.ORG.RU

simdutf 8.0.0

 , , , ,

simdutf 8.0.0

0

2

Состоялся выпуск 8.0.0 библиотеки simdutf.

Библиотека предоставляет быстрые SIMD-оптимизированные функции Unicode:

  • проверка строк ASCII, UTF-8, UTF-16LE/BE и UTF-32, с идентификацией ошибок и без неё;
  • транскодирование Latin1 в UTF-8, UTF-16LE/BE и UTF-32, с идентификацией ошибок и без неё;
  • подсчет символов в строках UTF-8 и UTF-16LE/BE;
  • перекодирование binary <-> base64, с URL-кодированием или без него;
  • изменение порядка байтов строк.

Библиотекой также предоставляются консольные утилиты fastbase64 и sutf.

Основным изменением в этой версии является поддержка constexpr большинством функций библиотеки, то есть они могут выполняться во время компиляции. Например, вы можете проверить, что строка является правильной в кодировке UTF-8 во время компиляции:

static_assert(simdutf::validate_utf8(s));

Возможность использования constexpr требует поддержки компилятором стандарта C++23.

Ещё одним важным изменением является добавление C API. Теперь вы можете легко вызывать simdutf из C (хотя вам по-прежнему необходимо линковаться с библиотекой C++, либо статически, либо во время выполнения). C API должен упростить написание обёрток для simdutf из других языков программирования. Теперь C-заголовок будет входить в релизы библиотеки.

Другие значительные изменения:

  • исправлена ошибка в функции utf8_length_from_utf16() для big endian;
  • добавлена совместимость с std::text_encoding (C++26);
  • доработаны функции в encoding_types.h;
  • исправлена ошибка переполнения буфера в функции convert_utf16_to_utf8_safe;
  • произведены обновления и оптимизации для Loongson;
  • улучшено тестирование.

>>> Подробности на GitHub

★★★★★

Проверено: CrX ()
Последнее исправление: CrX (всего исправлений: 1)

Ого, а предыдущие 7 мажорных версий когда успели выйти?

wandrien ★★★
()
Ответ на: комментарий от sparkie

…с URL-кодированием…

А по-русски из документации?

We support two conventions: base64_default and base64_url:

  • The default (base64_default) includes the characters + and / as part of its alphabet. It also pads the output with the padding character (=) so that the output is divisible by 4. Thus, we have that the string "Hello, World!" is encoded to "SGVsbG8sIFdvcmxkIQ==" with an expression such as simdutf::binary_to_base64(source, size, out, simdutf::base64_default). When using the default, you can omit the option parameter for simplicity: simdutf::binary_to_base64(source, size, out, buffer.data()). When decoding, white space characters are omitted as per the WHATWG forgiving-base64 standard. Further, if padding characters are present at the end of the stream, there must be no more than two, and if there are any, the total number of characters (excluding ASCII spaces ’ ’, ‘\t’, ’ ’, ‘\r’, ‘\f’ but including padding characters) must be divisible by four.
  • The URL convention (base64_url) uses the characters - and _ as part of its alphabet. It does not pad its output. Thus, we have that the string "Hello, World!" is encoded to "SGVsbG8sIFdvcmxkIQ" instead of "SGVsbG8sIFdvcmxkIQ==". To specify the URL convention, you can pass the appropriate option to our decoding and encoding functions: e.g., simdutf::base64_to_binary(source, size, out, simdutf::base64_url).

When we encounter a character that is neither an ASCII space nor a base64 character (a garbage character), we detect an error. To tolerate ‘garbage’ characters, you can use base64_default_accept_garbage or base64_url_accept_garbage instead of base64_default or base64_url.

dataman ★★★★★
() автор топика

вот честно, этот simdutf - смешная библиотека. Оптимизировали в мясо парсинг уже готовой строки - замечательно, а как вы ее получите? Нафигачите маллоков с ммапами, которые и сожрут всю производительность, и обложитесь RAII, чтобы не дай бог не забыть поставить free?

size_t expected_utf16words = simdutf::utf16_length_from_utf8(source, 4);
 
std::unique_ptr<char16_t[]> utf16_output{new char16_t[expected_utf16words]};

size_t utf16words = simdutf::convert_utf8_to_utf16le(source, 4, utf16_output.get());
 
std::cout << "wrote " << utf16words << " UTF-16LE code units." << std::endl;

(пример из доки) ну да, лол, он так и поступил. Сразу видно, профессор из университета писал))

Lrrr ★★★★★
()
Ответ на: комментарий от sparkie

когда букавки не влазят в ascii их кодируют %01 %02 %34 %FF и т.д.

ckotctvo
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.