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

Go字符串长度为何小于其首个rune的字节长度?

问题解析:字符串长度与rune字节数的矛盾

你遇到的问题核心在于对utf8.RuneLen的理解偏差,以及Go处理无效UTF-8字符串的规则:

  • len(string)的行为是正确的:它确实返回字符串的字节数,s := string("\xc0")只有1个字节,所以返回1没问题。
  • utf8.RuneLen(r)的定义要注意:它返回的是该rune本身在标准UTF-8编码下的字节数,而不是这个rune在原字符串中实际占用的字节数。

具体到你的例子:

  • "\xc0"是一个无效的UTF-8字节(UTF-8中以0xc0开头的字节必须跟随一个后续字节,单独存在属于非法序列)。
  • 当用range遍历字符串时,Go会自动将无效的UTF-8序列替换为Unicode替换字符U+FFFD(显示为�)。
  • U+FFFD这个rune的标准UTF-8编码是3个字节(0xEF 0xBF 0xBD),所以utf8.RuneLen(r)返回3,但它在原字符串中实际只占用了1个字节——这就是为什么字符串总长度(1)会小于单个rune的编码长度(3)。

简单总结:range遍历遇到无效UTF-8时会替换成标准的替换字符,而utf8.RuneLen只计算这个替换字符本身的标准编码长度,和原字符串里的实际字节数没有关联。

内容的提问来源于stack exchange,提问作者Daniel Whitford

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 02:05:24