strlen函数处理含非英文字符字符串时返回错误长度的问题咨询
strlen计算非英文字符串长度异常的原因与解决办法
问题本质
strlen()根本不是统计字符个数,它只算字符串里的字节数。
像ñ这种非ASCII字符,在UTF-8编码下占2个字节,而普通英文字母每个只占1个字节。所以"ñova"的总字节数是2+1+1+1=5,这就是strlen返回5的原因,你预期的4是实际的字符数量,两者统计维度完全不一样。
解决办法
如果要统计实际的字符个数,得用支持多字节字符的工具:
C语言方案:
可以先把多字节字符串转成宽字符,再用wcslen()统计,示例代码如下:#include <stdio.h> #include <wchar.h> #include <locale.h> #include <string.h> int main() { // 必须设置本地化,否则无法正确识别UTF-8 setlocale(LC_ALL, ""); const char *input = "ñova"; // 字节数(strlen的结果) printf("strlen输出:%zu\n", strlen(input)); // 转宽字符统计实际字符数 wchar_t wide_str[64]; mbstowcs(wide_str, input, sizeof(wide_str)/sizeof(wchar_t)); printf("实际字符数:%zu\n", wcslen(wide_str)); return 0; }运行后会输出:
strlen输出:5
实际字符数:4也可以手动遍历字符串:检查每个字节的最高位,若为0则是单字节字符,计数+1;若为1则是多字节起始,跳过对应字节后计数+1(UTF-8中多字节字符的起始字节会以
11开头,后续字节以10开头)。
内容的提问来源于stack exchange,提问作者Bover
相关产品推荐
相关产品推荐

