Как я могу получить правильную длину строки? - PullRequest
1 голос
/ 26 мая 2019

Почему моя функция считает больше символов, чем ожидалось?

int countLength(char* buffer){
    int cnt = 0;
    for (int i=0; buffer[i] != '\n' && buffer[i] != '\0'; i++){
        cnt++;
    }
    return cnt;
}

Например, если я передам слово "Será chuva? Será gente?" в качестве входных данных он дает 25 вместо 23. почему это так?

1 Ответ

2 голосов
/ 26 мая 2019

Код дает вам правильный ответ, даже если это не тот ответ, который вы ожидаете.

Проблема в том, что вы ожидаете, что он будет считать графемы (например, á, тогда как он считает байты / код-единицы (á состоит из двух кодовых единиц в составленной нормальной форме utf-8).

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

Читатьдля наборов символов, особенно и кодировка .

В целом cnt всегда отражает i.оптимизирующий компилятор удалит это дублирование, его даже не должно быть.

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