strlen返回字节数,mb_strlen才返回字符数;如"你好"在UTF-8下strlen得6(字节),mb_strlen("你好","UTF-8")得2(字符),且必须启用mbstring扩展并显式指定编码。

strlen 返回字节数,mb_strlen 才返回字符数
这是最根本的区别。比如字符串 "你好" 在 UTF-8 编码下占 6 个字节,strlen("你好") 返回 6;而它实际只有 2 个字符,mb_strlen("你好", "UTF-8") 才返回 2。如果你在表单验证、数据库字段长度校验或分页截取时用 strlen 判断中文内容,会直接导致逻辑错误——比如限制 10 个字符的昵称,用户输 4 个中文就被拦住(strlen 算出 12 字节),但其实只用了 4 个字符。
mb_strlen 必须指定编码,否则可能失效
mb_strlen($str) 不带第二个参数时,会依赖 mb_internal_encoding() 的当前值。这个值可能来自 php.ini、运行时设置,甚至被其他代码中途修改。一旦内部编码没设对(比如默认是 ISO-8859-1),mb_strlen("你好") 就会按单字节方式解析,结果变成 6 ——和 strlen 一样错。
- 推荐始终显式传编码:
mb_strlen($str, "UTF-8") - 避免依赖全局设置,尤其在多模块共存或框架环境下
- 如果输入编码不确定,先用
mb_detect_encoding()检测,再转成 UTF-8 后计算
mbstring 扩展不是默认启用的
很多轻量环境(如某些 Docker 镜像、Alpine PHP、部分共享主机)默认不开启 mbstring 扩展。调用 mb_strlen 会直接报 Fatal error: Uncaught Error: Call to undefined function mb_strlen()。
- 检查是否启用:
extension_loaded("mbstring") - 确认 php.ini 中有
extension=mbstring(注意路径和扩展文件名是否匹配) - Linux 下常见缺失:Alpine 需装
php82-mbstring(版本号按实际调整),Ubuntu/Debian 装php-mbstring
别把 strlen 当“快替代”来用
有人觉得 strlen 不用指定编码、不依赖扩展,就“更轻更快”,在纯英文场景下确实如此。但现代 PHP 应用几乎不可能只处理 ASCII:HTTP 请求头、JSON 数据、数据库返回、用户输入……全可能是 UTF-8。一旦混入 emoji(如 "?" 占 4 字节)、生僻汉字或日文假名,strlen 就不可信。
-
"a?":strlen →2(错),mb_strlen(..., "UTF-8") →2(对) -
"café":strlen →5(c,a,f,é 4 字符但 é 是 2 字节),mb_strlen →4 - 真正需要字节长度的场景极少,比如计算 HTTP body 大小、二进制协议解析——这种时候才该用
strlen
实际项目里,只要字符串可能含非 ASCII 内容,mb_strlen 就不是“可选优化”,而是底线要求。最容易被忽略的是编码参数的硬编码和扩展可用性检查——这两点出问题,线上可能跑几个月才暴露一次截断 bug。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











