Найти конец C строки
От: TheBeginner  
Дата: 25.01.24 06:44
Оценка:
Нужно что-то типа 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
Re: Найти конец C строки
От: _NN_ www.nemerleweb.com
Дата: 25.01.24 07:29
Оценка:
Здравствуйте, TheBeginner, Вы писали:

TB>Нужно что-то типа strlen, которая определяет длину строки в байтах но для разных кодировок (список ниже).

TB>Кодировка конкретной строки известна.
TB>С однобайтовыми, utf8 все просто, первый нулевой байт — конец строки. Для utf16/utf32 тоже все понятно.
TB>С остальными кодировками так понимаю можно промахнуться просто найдя первый нулевой байт или нет?
TB>Все это желательно без библиотек и максимально быстро.

Простые решения уже не в моде ?
Если это однобайтовая кодировка то один нулевой байт, если двубайтовая два нулевых, а если четырёхбайтовая то четыре.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Найти конец C строки
От: TheBeginner  
Дата: 25.01.24 08:00
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Простые решения уже не в моде ?

_NN>Если это однобайтовая кодировка то один нулевой байт, если двубайтовая два нулевых, а если четырёхбайтовая то четыре.

Ну я ж написал:
TB>>С однобайтовыми, utf8 все просто, первый нулевой байт — конец строки. Для utf16/utf32 тоже все понятно.
Вопрос, возможны ли проблемы с некоторыми MBCS. Вот например, GB2312, Shift-JIS, EUC-KR кодируются 1-2 байтами, но нулевого байта там быть не должно.
Если еще кодировки с переменным числом байт на символ где может быть нулевой байт?
Если нет, то тут все просто конечно — отдельно обрабатываем UTF16/UTF32, а все остальные до первого нулевого байта.

Если еще конкретнее — существуют ли кодировки с переменным числом байт на символ, где может быть нулевой байт в последовательности байт кодирующей один символ.
По идее — не должно.
Отредактировано 25.01.2024 8:17 TheBeginner . Предыдущая версия .
Re: Найти конец C строки
От: Pavel Dvorkin Россия  
Дата: 25.01.24 08:34
Оценка:
Здравствуйте, TheBeginner, Вы писали:

TB>Нужно что-то типа strlen, которая определяет длину строки в байтах но для разных кодировок (список ниже).

TB>Кодировка конкретной строки известна.
TB>С однобайтовыми, utf8 все просто, первый нулевой байт — конец строки. Для utf16/utf32 тоже все понятно.
TB>С остальными кодировками так понимаю можно промахнуться просто найдя первый нулевой байт или нет?
TB>Все это желательно без библиотек и максимально быстро.

Без библиотек не знаю, а так есть

int mblen(const char *str, size_t size)
Прототип:
stdlib.h
Описание:
Эта функция возвращает длину многобайтового символа, на который указывает параметр str. Анализируются только size первых символов.

https://www.c-cpp.ru/content/mblen
https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/mbclen-mblen-mblen-l?view=msvc-170

После вызова продвигаешь str на то, что она вернула
Когда она вернет 0 , то и строке конец.
With best regards
Pavel Dvorkin
Re[2]: Найти конец C строки
От: TheBeginner  
Дата: 25.01.24 09:22
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>int mblen(const char *str, size_t size)


Решение интересное конечно, но надо задавать локаль и использовать только для MBCS кодировок.
Если нужно просто кол-во байт, а не символов, то видимо проще обработать UTF16/UTF32 строки отдельно, а для всех остальных — до первого нулевого байта.
MBCS кодировок, где может быть нулевой байт в последовательности кодирующей символ, такого видимо и нет. Это было бы нелогично.
Re[3]: Найти конец C строки
От: Pavel Dvorkin Россия  
Дата: 25.01.24 10:43
Оценка:
Здравствуйте, TheBeginner, Вы писали:

TB>MBCS кодировок, где может быть нулевой байт в последовательности кодирующей символ, такого видимо и нет. Это было бы нелогично.


Хм.. Не уверен.

UTF16 тоже в некотором абстрактном смысле multi-byte, только везде по 2. И первый нулевой байт вполне может быть. Байты инвертированы, то есть сначала младший, потом старший.
Вот двух подряд нулевых байтов с четного адреса быть не может, это терминатор.

А теперь представь себе TBCS,

https://en.wikipedia.org/wiki/Double-byte_character_set#TBCS

в которой всегда по 3 байта. И если байты тоже инвертированы, то тогда они выглядят так

ss mm ll (а понимать нужно как llmmss)

и почему тут ss не может быть 0 , я не понимаю. Им всем нужно иметь ss == 0 ? А тогда на что он нужен ?
With best regards
Pavel Dvorkin
Re[4]: Найти конец C строки
От: Jack128  
Дата: 25.01.24 11:12
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:


PD>UTF16 тоже в некотором абстрактном смысле multi-byte, только везде по 2.

Безо всяких абстрактных смыслов. В UTF16 каждый код поинт кодируется или 2мя или 4мя байтами
Re[4]: Найти конец C строки
От: TheBeginner  
Дата: 25.01.24 12:02
Оценка:
Здравствуйте, 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 байта и нулевого байта в начале или середине быть не может.
Если ли исключения — вот это интересно было бы узнать.
Отредактировано 25.01.2024 12:07 TheBeginner . Предыдущая версия . Еще …
Отредактировано 25.01.2024 12:05 TheBeginner . Предыдущая версия .
Re[5]: Найти конец C строки
От: Pavel Dvorkin Россия  
Дата: 25.01.24 12:19
Оценка:
Здравствуйте, Jack128, Вы писали:

PD>>UTF16 тоже в некотором абстрактном смысле multi-byte, только везде по 2.

J>Безо всяких абстрактных смыслов. В UTF16 каждый код поинт кодируется или 2мя или 4мя байтами

Спасибо. Я это знаю. А сказать я хотел то, что сказал. Выделил сейчас
With best regards
Pavel Dvorkin
Re[5]: Найти конец C строки
От: Pavel Dvorkin Россия  
Дата: 25.01.24 12:24
Оценка:
Здравствуйте, 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>Если ли исключения — вот это интересно было бы узнать.


Не знаю. Посмотри всякие кодировки — если найдешь хоть одну, ответ — может. Если не найдешь — ответа нет.
With best regards
Pavel Dvorkin
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.