Функция на языке Си для конвертации строк из кодировки UTF-8 в Windows-1251 (CP1251)
Файл с функцией: https://github.com/0x1801/REPA/blob/main/utf8_2_win1251.c
- Поставляется в виде исходного кода.
- Написана на языке С.
- Может быть использована в программах на языке C++.
- Может применяться в программах для микроконтроллеров
- Не использует ни SIMD-инструкций, ни даже x64.
- Использует очень мало памяти: 1 массив на 32 байта (компилятор кладет его в векторный регистр, если он есть) + несколько констант.
- Поддерживает символы utf8 до 4х байт (стандарт RFC 3629)
- Входной массив может совпадать с выходным: данные будут перезаписаны.
Применение:
Вам ничего не понадобится, кроме текста функции и 3х макросов перед ней. Ни инклюдов и библиотек, ни массивов, никакого другого кода. Просто скопируйте ее в свой проект.
ВНИМАНИЕ: Функция требует наличия 2х лишних выделенных байтов памяти за символом конца строки во входном массиве с символами utf8. В этих байтах может лежать любой мусор. Обычно, если в вашем проекте код написан оптимально, то вы не будете каждый раз выделять память под строку. Поэтому выделить 2 лишних байта - это не проблема. Но если в вашем проекте сложно это внедрить, то можете немного самостоятельно модифицировать код.
Если есть желание проверить работу функции, можно написать тест самостоятельно или воспользоваться заготовкой из main.c: https://github.com/0x1801/REPA/blob/main/main.c
Больше main.c ни для чего не нужен.
БОНУС: в файле https://github.com/0x1801/REPA/blob/main/koi8r_2_windows1251_AVX512.c можно найти функцию конвертации из любой 8-битной ASCII-совместимой кодировки в любую 8-битную ASCII-совместимую кодировку, написанную с использованием векторных инструкций AVX512. В коде для примера реализована конвертация из koi8r в windows 1251, но алгоритм пригоден для конвертации любоых сочетаний 8-битных кодировок, совместимых с ASCII. Признаюсь честно, что сам я ее тестировать поленился, т.к. msvc 2015 "из коробки" не знает функций, которые я использовал. Функция, как минимум, компилируется (в коментарии к ней ссылка на godbolt.org). Просто мне было интересно написать функцию, которая умеет конвертировать сразу 64 символа всего за 12 инструкций (само отображение занимает при этом вообще 2 инструкции). Если вам удастся протестировать функцию или найти в ней ошибки (или улучшения), напишите мне, пожалуйста.
Связаться с автором:
Илья