2014-02-15 4 views
0

У меня есть приложение, принимающее строку UTF-8 максимум 255 символов.Получить количество символов в строке?

Если символы ASCII, (номера символов == размер в байтах).

Если символы не все ASCII и содержат, например, японские буквы, учитывая размер в байтах, как я могу получить количество символов в строке?

Вход: char *data, int bytes_no
Выход: int char_no

+1

Вы используете C или C++?Я думаю, нам следует сказать –

+0

Извините, я использую C++ – Luka

+0

Вы ищете алгоритм, который вы можете реализовать самостоятельно, или используете библиотеку (на какой ОС?) Нормально? – hyde

ответ

5

Вы можете использовать mblen рассчитывать длину или использовать mbstowcs

Источник:

http://www.cplusplus.com/reference/cstdlib/mblen/

http://www.cl.cam.ac.uk/~mgk25/unicode.html#mod

Число символов может быть отсчитано на C портативным способом, используя mbstowcs (NULL, s, 0). Это работает для UTF-8, как и для любой другой поддерживаемой кодировки , если выбрана соответствующая локаль. A проводная техника для подсчета количества символов в строке UTF-8 должна считать все байты, кроме тех, которые находятся в диапазоне 0x80 - 0xBF, , потому что это просто байты продолжения, а не символы их . Тем не менее, необходимость подсчета символов возникает неожиданно редко в приложениях.

вы можете сохранить Юникод символ в широком полукоксе wchar_t

+0

«необходимость подсчета символов возникает неожиданно редко в приложениях» - так очень верно. –

2

Там нет такого понятия, как «характер».

Или, точнее, какой «характер» зависит от того, кого вы спрашиваете.

Если вы посмотрите в Unicode glossary, вы обнаружите, что этот термин имеет несколько не полностью совместимых значений. Как самый маленький компонент письменного языка, который имеет смысловое значение (первое значение), - это один символ. Если вы принимаете и подсчитываете базовую единицу кодирования для кодировки символов Юникода (в третьем смысле), вы можете получить один или два, в зависимости от того, какое точное представление (нормализованное или денормализованное) используется.

Возможно, нет. Это очень сложный вопрос, и никто не знает, что они говорят.

Спустившись на землю, вам, вероятно, нужно будет пересчитывать кодовые точки, которые по существу совпадают с символами (что означает 3). mblen - это один из способов сделать это, если ваш текущий язык имеет кодировку UTF-8. Современные C++ предлагают more C++-ish methods, однако они не поддерживаются в некоторых популярных реализациях. Boost имеет something of its own и более портативен. Тогда есть специализированные библиотеки, такие как ICU, которые вы можете рассмотреть, если ваши потребности намного сложнее, чем подсчет символов.

+0

Чтение OP, самое первое, что я задавался вопросом, было в значении «строки UTF-8 из 255 символов». Будет ли это 255 * байты *, или 255 раз символ Unicode "" (в UTF-8: 'F0 9F 98 84')? – usr2564301

Смежные вопросы