LINUX.ORG.RU

Как разделить многобайтовую строку на несколько частей?


0

1

Как разделить многобайтовую строку на несколько составляющих ее подстрок? Первое, что приходит в голову - преобразовать mb строку в wc строку, wc строку порезать на нужное число частей, получившиеся кусочки wc строк преобразовать обратно в mb строки.

В utf-8 легко отличить первый байт символа от продолжения: байты продолжения в побитовом представлении обязательно имеют вид 10xxxxxx. Поэтому если хочешь считать именно символы, а не байты, то когда просматриваешь строку нужно пропускать байты вида 10xxxxxx.

Manhunt ★★★★★
()

как резать-то? почему нельзя порезать например по 140 символов, моя мобила так и режет. Вот sed-код

sed -r 's/.{,140}/&\n/g'
(используется стандартная библиотека из glibc)

drBatty ★★
()
Ответ на: комментарий от Manhunt

ИМХО разве нет стандартной функции для задачи ТС? (самой задачи нет, потому мне это не слишком понятно).

drBatty ★★
()
Ответ на: комментарий от drBatty

Какой функцией на C можно порезать на эти 140 (или неважно сколько) символов? Но именно символов, а не байт.

zloy_starper ★★★
() автор топика

готовые функции для utf8 есть в glib. либо делать как написал Manhunt.

waker ★★★★★
()
Ответ на: комментарий от zloy_starper

Например, g_utf8_offset_to_pointer в цикле.

akk ★★★★★
()
Ответ на: комментарий от Manhunt

В utf-8 легко отличить первый байт символа от продолжения: байты продолжения в побитовом представлении обязательно имеют вид 10xxxxxx. Поэтому если хочешь считать именно символы, а не байты, то когда просматриваешь строку нужно пропускать байты вида 10xxxxxx.

Похоже это самое простое и быстрое в реализации решение.

Ну разве еще попробовать заморочки с mbsrtowcs в цикле.

zloy_starper ★★★
() автор топика

Что такое «multibyte» - зависит от локали. Если там не mb, а точно UTF-8, то искать байт & 0x80, иначе единственный правильный способ - mbrtowc в цикле.

slovazap ★★★★★
()

мне кажется, надо сначала выставить локаль, а потом можно разделять сколько угодно стандартными функциями из libc, вроде strtok и других

Harald ★★★★★
()
Ответ на: комментарий от Harald

мне кажется, надо сначала выставить локаль, а потом можно разделять сколько угодно стандартными функциями из libc, вроде strtok и других

В моем случае не вариант. Задача стоит так: если строка слишком длинная, ее надо разделить на набор коротких. Какие в ней искать лексемы?

zloy_starper ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.