В UTF-8 не ведущий байт всегда имеет верхние два бита, установленные на 10
, поэтому просто игнорируйте все такие байты. Если вы не возражаете против дополнительной сложности, вы можете сделать больше (пропустить вперед не ведущие байты на основе битовой комбинации старшего байта), но в действительности это вряд ли будет иметь большое значение, за исключением коротких строк (потому что как правило, вы все равно будете близки к пропускной способности памяти).
Редактировать: Первоначально я неправильно прочитал ваш вопрос как просто вопрос о том, как считать длину строки символов, закодированных в UTF-8. Если вы хотите посчитать символьные частоты, вы, вероятно, захотите преобразовать их в UTF-32 / UCS-4 , тогда вам понадобится какой-то разреженный массив для подсчета частот.
Сложная часть этого относится к подсчету кодовых очков против символов. Например, рассмотрим символ «А» - «латинская заглавная буква А с могилой». Есть как минимум два разных способа создания этого персонажа. Вы можете использовать кодовую точку U + 00C0, которая кодирует все это в одной кодовой точке, или , вы можете использовать кодовую точку U + 0041 (латинская заглавная буква A), за которой следует кодовая точка U + 0300 (объединение серьезного акцента) .
Нормализация (относительно Unicode) означает превращение всех таких символов в одну и ту же форму. Вы можете объединить их все в одну кодовую точку или разделить их на отдельные кодовые точки. Для ваших целей, возможно, проще объединить их в одну кодовую точку, когда это возможно. Написание этого самостоятельно, вероятно, не очень практично - я бы использовал API нормализатора из проекта ICU.