You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 21:52:37