Код дает вам правильный ответ, даже если это не тот ответ, который вы ожидаете.
Проблема в том, что вы ожидаете, что он будет считать графемы (например, á
, тогда как он считает байты / код-единицы (á
состоит из двух кодовых единиц в составленной нормальной форме utf-8).
Первое приближение должно было бы вместо этого подсчитать кодовые точки, пропуская байты продолжения (> 0x7f и <0xc0)Чтобы реально считать графемы, вы должны будете использовать надлежащую юникод-библиотеку со всей символьной информацией, такой как <a href="https://de.wikipedia.org/wiki/International_Components_for_Unicode" rel="nofollow noreferrer"> международные компоненты для юникода (ICU) , и принимать их решения.
Читатьдля наборов символов, особенно Юникод и кодировка utf-8 .
В целом cnt
всегда отражает i
.оптимизирующий компилятор удалит это дублирование, его даже не должно быть.