Как узнать количество символов в строке utf8 - PullRequest
4 голосов
/ 18 августа 2011

Я хочу знать, есть ли простой способ определить количество символов в строке UTF8.Например, в Windows это можно сделать следующим образом:

  1. преобразование UTF8 строки в wchar_t строку
  2. с использованием функции wcslen и получение результата

Но мне нужно более простое и кроссплатформенное решение.

Заранее спасибо.

Ответы [ 3 ]

4 голосов
/ 18 августа 2011

Вся концепция «количества символов» на самом деле не применима к Юникоду, поскольку коды не отображают 1: 1 на глифы. Метод, предложенный @borrible, подойдет, если вы хотите установить требования к хранилищу в несжатом виде, но это все, что он может вам сказать.

Например, есть такие кодовые точки, как «пробел нулевой ширины», которые не занимают места на экране при визуализации, но занимают кодовую точку или модификаторы для диакритических знаков или гласных. Поэтому любая статистика должна быть конкретной для конкретного приложения.

Правильный рендерер Unicode будет иметь функцию, которая может сказать вам, сколько пикселей будет использовано для рендеринга строки, если эта информация - то, что вам нужно.

4 голосов
/ 18 августа 2011

Символы UTF-8 представляют собой либо одиночные байты, где самый левый бит равен 0, либо несколько байтов, где первый байт имеет самый левый бит 1..10... (с числом 1 с слева 2 или далее), за которыми следуют последовательные байты вида 10... (т.е. один 1 слева). Предполагая, что ваша строка правильно сформирована, вы можете перебрать все байты и увеличивать «счетчик символов» каждый раз, когда видите байт, который не имеет форму 10... - т.е. считая только первые байты во всех символах UTF-8 .

1 голос
/ 18 августа 2011

Если известно, что строка является допустимой UTF-8, просто укажите длину строки в байтах, исключая байты, значения которых находятся в диапазоне 0x80-0xbf:

size_t i, cnt;
for (cnt=i=0; s[i]; i++) if (s[i]<0x80 || s[i]>0xbf) cnt++;

Обратите внимание, что s должен указывать на массив unsigned char, чтобы сравнение работало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...