libcodes: кодировки кириллицы
Зачем это надо?
Программный интерфейс
Кодировка utf-8
Кодировка utf-16
Верхний и нижний регистр
Мультибайтовые кодировки
Исходный код
Зачем это надо?
Не знаю. Но мне нравится. Привык пользоваться этим набором примитивов, а поскольку 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
. Возвращает количество символов в выходной строке, которое может отличаться от длины исходной строки.