Вышла библиотека Mojibake — низкоуровневая C11-библиотека для работы с Unicode 17. Она совместима с C++17 и распространяется по лицензии MIT. Установка не нужна: просто кладёте два файла (mojibake.c и mojibake.h) в проект и готово.
Mojibake — маленькая, быстрая и самодостаточная. Работает на Linux, macOS, FreeBSD, OpenBSD, NetBSD и Windows 10/11. Проходит официальные тестовые наборы Unicode для всех поддерживаемых алгоритмов. Внутри — таблицы Unicode, объединённые в один большой файл. Никаких зависимостей.
Библиотека умеет нормализовывать текст (NFC/NFD/NFKC/NFKD), делать NFKC-фолдинг для идентификаторов и быстро проверять, нормализована ли строка (всё по UAX #15, Unicode 17.0.0). Есть регистрозависимые преобразования (верхний, нижний, заглавный, case folding) с учётом условных правил. Можно фильтровать управляющие символы, пробелы и цифры прямо во время нормализации.
Из анализа — полный доступ к свойствам символов Unicode (категория, скрипт, блок, числовое значение, имя). Поддерживается сегментация на графемные кластеры, слова, предложения и места переноса строки (UAX #29 и UAX #14). Есть полный алгоритм двунаправленного текста (UAX #9), работа с эмодзи (свойства кодовых точек, последовательности, детекция RGI эмодзи). Считает ширину отображения — восточноазиатскую и терминальную, умеет обрезать строки с учётом ширины.
Для сортировки и сравнения реализован Unicode Collation Algorithm (UTS #10) — сравнение строк и ключи сортировки в shifted и non-ignorable режимах. Безопасность: генерация «скелетов» для обнаружения визуально конфликтных символов и проверка, являются ли строки конфузабельными (UTS #39). Для авторов парсеров — валидация идентификаторов XID/ID (UAX #31).
Вход и выход — UTF-8, UTF-16LE/BE, UTF-32LE/BE, с автоопределением и конвертацией. Есть посимвольная итерация, строковые хелперы в стиле string.h, разбор языковых тегов BCP 47. Библиотека легко встраивается: кастомные аллокаторы, флаги сборки для сокращения таблиц (например, отключение имён символов уменьшает бинарник примерно на 30%), C++17-обёртка, CLI-инструмент и WASM + TypeScript API.
Тестируется на 1,5 миллионах проверок, включая официальные сьюты Unicode. Фаззинг через libFuzzer с ненадёжными байтами на входе, чисто под AddressSanitizer и UBSan. Исходники и примеры использования — в репозитории.