Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

46 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

REPA

Функция на языке Си для конвертации строк из кодировки 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 инструкции). Если вам удастся протестировать функцию или найти в ней ошибки (или улучшения), напишите мне, пожалуйста.

Связаться с автором:

Илья

chronosphere@mail.ru.

About

Функция на языке Си для конвертации строк из кодировки UTF-8 в Windows-1251 (CP1251) Utf8 to Windows-1251 converter

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages