Нужно что-то типа strlen, которая определяет длину строки в байтах но для разных кодировок (список ниже).
Кодировка конкретной строки известна.
С однобайтовыми, utf8 все просто, первый нулевой байт — конец строки. Для utf16/utf32 тоже все понятно.
С остальными кодировками так понимаю можно промахнуться просто найдя первый нулевой байт или нет?
Все это желательно без библиотек и максимально быстро.
UTF-8
UTF-16BE
UTF-16LE
UTF-32BE
UTF-32LE
Japanese Shift_JIS
Japanese ISO-2022-JP
Simplified Chinese ISO-2022-CN
Korean ISO-2022-KR
Chinese GB18030
Traditional Chinese Big5
Japanese EUC-JP
Korean EUC-KR
Western Europe ISO-8859-1 (Danish, Dutch, English, French, German, Italian, Norwegian, Portuguese, Swedish)
Eastern Europe ISO-8859-2 (Czech, Hungarian, Polish, Romanian)
Cyrillic ISO-8859-5 (Russian)
Arabic ISO-8859-6
Greek ISO-8859-7
Hebrew ISO-8859-8
Turkish ISO-8859-9
Eastern Europe windows-1250 (Czech, Hungarian, Polish, Romanian)
Cyrillic windows-1251 (Russian)
Western Europe windows — 1252/WinLatin 1 (Danish, Dutch, English, French, German, Italian, Norwegian, Portuguese, Swedish)
Greek windows-1253
Turkish windows-1254
Hebrew windows-1255
Arabic windows-1256
Cyrillic KOI8-R (Russian)
IBM420 Arabic
Hebrew IBM424
Здравствуйте, TheBeginner, Вы писали:
TB>Нужно что-то типа strlen, которая определяет длину строки в байтах но для разных кодировок (список ниже). TB>Кодировка конкретной строки известна. TB>С однобайтовыми, utf8 все просто, первый нулевой байт — конец строки. Для utf16/utf32 тоже все понятно. TB>С остальными кодировками так понимаю можно промахнуться просто найдя первый нулевой байт или нет? TB>Все это желательно без библиотек и максимально быстро.
Простые решения уже не в моде ?
Если это однобайтовая кодировка то один нулевой байт, если двубайтовая два нулевых, а если четырёхбайтовая то четыре.
Здравствуйте, _NN_, Вы писали:
_NN>Простые решения уже не в моде ? _NN>Если это однобайтовая кодировка то один нулевой байт, если двубайтовая два нулевых, а если четырёхбайтовая то четыре.
Ну я ж написал: TB>>С однобайтовыми, utf8 все просто, первый нулевой байт — конец строки. Для utf16/utf32 тоже все понятно.
Вопрос, возможны ли проблемы с некоторыми MBCS. Вот например, GB2312, Shift-JIS, EUC-KR кодируются 1-2 байтами, но нулевого байта там быть не должно.
Если еще кодировки с переменным числом байт на символ где может быть нулевой байт?
Если нет, то тут все просто конечно — отдельно обрабатываем UTF16/UTF32, а все остальные до первого нулевого байта.
Если еще конкретнее — существуют ли кодировки с переменным числом байт на символ, где может быть нулевой байт в последовательности байт кодирующей один символ.
По идее — не должно.
Здравствуйте, TheBeginner, Вы писали:
TB>Нужно что-то типа strlen, которая определяет длину строки в байтах но для разных кодировок (список ниже). TB>Кодировка конкретной строки известна. TB>С однобайтовыми, utf8 все просто, первый нулевой байт — конец строки. Для utf16/utf32 тоже все понятно. TB>С остальными кодировками так понимаю можно промахнуться просто найдя первый нулевой байт или нет? TB>Все это желательно без библиотек и максимально быстро.
Без библиотек не знаю, а так есть
int mblen(const char *str, size_t size)
Прототип:
stdlib.h
Описание:
Эта функция возвращает длину многобайтового символа, на который указывает параметр str. Анализируются только size первых символов.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>int mblen(const char *str, size_t size)
Решение интересное конечно, но надо задавать локаль и использовать только для MBCS кодировок.
Если нужно просто кол-во байт, а не символов, то видимо проще обработать UTF16/UTF32 строки отдельно, а для всех остальных — до первого нулевого байта.
MBCS кодировок, где может быть нулевой байт в последовательности кодирующей символ, такого видимо и нет. Это было бы нелогично.
Здравствуйте, TheBeginner, Вы писали:
TB>MBCS кодировок, где может быть нулевой байт в последовательности кодирующей символ, такого видимо и нет. Это было бы нелогично.
Хм.. Не уверен.
UTF16 тоже в некотором абстрактном смысле multi-byte, только везде по 2. И первый нулевой байт вполне может быть. Байты инвертированы, то есть сначала младший, потом старший.
Вот двух подряд нулевых байтов с четного адреса быть не может, это терминатор.
PD>UTF16 тоже в некотором абстрактном смысле multi-byte, только везде по 2.
Безо всяких абстрактных смыслов. В UTF16 каждый код поинт кодируется или 2мя или 4мя байтами
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>UTF16 тоже в некотором абстрактном смысле multi-byte, только везде по 2.
Конечно. И нулевой байт (или байты для UTF32) появляются из-за фиксированного размера байт на символ. Они просто лишние. (В UTF16 еще могут быть суррогатные пары, но это не имеет значения если просто искать конец строки)
PD>И первый нулевой байт вполне может быть. Байты инвертированы, то есть сначала младший, потом старший. PD>Вот двух подряд нулевых байтов с четного адреса быть не может, это терминатор.
Есть и UTF-16BE и UTF-32BE с прямым порядком байт (Big Endian), но это не принципиально если UTF16/UTF32 строки обрабатываем отдельно, проверяя все 2 или 4 байта на ноль.
PD>А теперь представь себе TBCS, PD>https://en.wikipedia.org/wiki/Double-byte_character_set#TBCS PD>в которой всегда по 3 байта. И если байты тоже инвертированы, то тогда они выглядят так
Это как раз случай с фиксированным количеством байт на символ. И теоретически конечно может быть ноль в начале или в середине. Но я если честно не знаю где применяется такая кодировка.
Если взять кодировку с переменным количеством байт на символ (1-2 или 1-4?) то они похожи по логике на UTF8, где для кодирования символа используется 1-4 байта и нулевого байта в начале или середине быть не может.
Если ли исключения — вот это интересно было бы узнать.
Здравствуйте, Jack128, Вы писали:
PD>>UTF16 тоже в некотором абстрактном смысле multi-byte, только везде по 2. J>Безо всяких абстрактных смыслов. В UTF16 каждый код поинт кодируется или 2мя или 4мя байтами
Спасибо. Я это знаю. А сказать я хотел то, что сказал. Выделил сейчас
Здравствуйте, TheBeginner, Вы писали:
TB>Конечно. И нулевой байт (или байты для UTF32) появляются из-за фиксированного размера байт на символ. Они просто лишние. (
Совершенно верно. Убрать их — и будет UTF8 (упрощенно)
PD>>А теперь представь себе TBCS, PD>>https://en.wikipedia.org/wiki/Double-byte_character_set#TBCS PD>>в которой всегда по 3 байта. И если байты тоже инвертированы, то тогда они выглядят так
TB>Это как раз случай с фиксированным количеством байт на символ. И теоретически конечно может быть ноль в начале или в середине. Но я если честно не знаю где применяется такая кодировка.
Верно, что с фиксированным, но не исключаю, что TBCS считается все же как multi byte. Просто multi всегда рано 3
"Константа — это переменная, которая меняется реже других"
TB>Если взять кодировку с переменным количеством байт на символ (1-2 или 1-4?) то они похожи по логике на UTF8, где для кодирования символа используется 1-4 байта и нулевого байта в начале или середине быть не может.
Не может.
TB>Если ли исключения — вот это интересно было бы узнать.
Не знаю. Посмотри всякие кодировки — если найдешь хоть одну, ответ — может. Если не найдешь — ответа нет.