为什么我的函数计算的字符数超出预期?
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。为什么呢?
答案 0 :(得分:2)
该代码为您提供了正确的答案,即使它不是您期望的答案。
问题是您希望它计数字素(例如á
,而它计数字节/代码单位(á
由utf-8正常形式的两个代码单位组成)。
第一个近似值是通过跳过连续字节(> 0x7f和<0xc0)来计数代码点。要真正计数字素,您必须使用具有所有字符信息(如international components for unicode (ICU))的适当的unicode库,并接受其决定。
顺便说一句,cnt
始终镜像i
。尽管优化的编译器会删除此重复项,但它甚至不应该存在。