libcodes: кодировки кириллицы

libcodes: кодировки кириллицы

Зачем это надо?

Не знаю. Но мне нравится. Привык пользоваться этим набором примитивов, а поскольку libmorph поддерживает не только разумные, но и неразумные кодовые страницы, в сборку shared library/dll над включать что-то для этого — просто для самодостаточности.

Можно использовать iconv, но сборка её каждый раз приводит к необходимости тянуться за старым, обтянутым человеческой кожей бубном, смазывать его кровью убитой в полнолуние жабы и начинать камлать. Может, обе руки - левые, может - растут откуда-то не оттуда.

Тем не менее, библиотека сложилась сама, используется, а потому тоже выложена в открытый доступ.

Из разумных поддерживаются кодировки utf-16, utf-8 и 1251. Из безумных — koi8, 866 (oem), Maс и ISO-8859-5.

Программный интерфейс

Декларируются следующие константы - идентификаторы кодовых страниц:

const unsigned codepage_1251 = 1; const unsigned codepage_1252 = 2; const unsigned codepage_1254 = 7; const unsigned codepage_koi8 = 3; const unsigned codepage_866 = 4; const unsigned codepage_iso = 5; const unsigned codepage_mac = 6; const unsigned codepage_utf8 = 0x10;

Для utf-16 отдельного кода не резервируется - её ни с чем не спутаешь, у функции другой прототип.

Кодировка utf-8

bool utf8detect( const char* pszstr, size_t cchstr = (size_t)-1 );
Функция проверяет, подходит ли строка под определение utf-8.

size_t utf8cbchar( const char* ptrtop, const char* ptrend );
Функция возвращает количество байт, которыми закодирован очередной символ utf-8 - строки.

size_t utf8strlen( const char* pszstr, size_t cchstr = (size_t)-1 );
Функция вычисляет количество закодированных символов в utf-8 - строке.

Кодировка utf-16

size_t utf8decode( widechar* output, size_t maxlen, const char* pszstr, size_t cchstr = (size_t)-1 );
Декодирует utf-8 - строку длиной cchstr в её utf-16 - представление, в массив максимальной размерности maxlen. Возвращает количество раскодированных символов, не включая финальный 0, который, тем не менее, при возможности устанавливается.

size_t utf8encode( char* output, size_t cchout, const widechar* pwsstr, size_t cchstr = (size_t)-1 );
Выполняет обратное кодирование utf-16 - строки длиной cchstr в представление utf-8 максимальной размерности cchout. Возвращает количество восстановленных байт, не включая завершающего нулевого символа.

Верхний и нижний регистр

Зачем тут нужны эти функции, я вообще, честно говоря, не знаю, но таблицы верхнего и нижнего регистра для utf-16 были, так что подставить их в шаблоны оказалось проще, чем задумываться о цели этого действия. Итак,
size_t strtolower( widechar* o, size_t l, const widechar* s, size_t u = (size_t)-1 );
Функция преобразует utf-16 - строку s длиной u в нижний регистр и помещает в массив o расмерности l. При возможности завершает улевым символом. Возвращает количество скопированных символов за вычетом финального нуля, который добавляет самостийно.

size_t strtoupper( widechar* o, size_t l, const widechar* s, size_t u = (size_t)-1 );
Функция аналогична strtolower, но преобразует строку в верхний регистр.

size_t strtolower( unsigned codepage, char* o, size_t l, const char* s, size_t u = (size_t)-1 );
Преобразование в нижний регистр строки в некоторой (поддерживаемой) мультибайтовой кодировке codepage.

size_t strtoupper( unsigned codepage, char* o, size_t l, const char* s, size_t u = (size_t)-1 );
Преобразование строки в мультибайтовой кодировке в верхний регистр.

Мультибайтовые кодировки

size_t mbcstowide( unsigned codepage, widechar* o, size_t l, const char* s, size_t u = (size_t)-1 );
Функция преобразует исходную строку s длиной uв кодировке codepage в utf-16 - строку, которую помещает в выходной массив o размерностью l. Возвращает количество символов в выходной строке, которое может отличаться от исходного - например, для utf-8.

size_t widetombcs( unsigned codepage, char* o, size_t l, const widechar* s, size_t u = (size_t)-1 );
Функция преобразует исходную utf-16 - строку s длиной u в мультибайтовую кодировку codepage и возвращает количество байт, восстановленных в массив o размерностью l.

size_t mbcstombcs( unsigned dstcps, char* o, size_t l, unsigned srccps, const char* s, size_t u = (size_t)-1 );
Функция преобразует исходную строку s длиной uв кодировке srccps в строку в кодировке dstcps, которую помещает в выходной массив o размерностью l. Возвращает количество символов в выходной строке, которое может отличаться от длины исходной строки.

Исходный код