strlen() 返回字节长度而非字符数,适用于纯ASCII字符串;含中文等多字节字符时应使用mb_strlen($str, 'UTF-8')获取真实字符数。

PHP 7.1 中直接用 strlen() 就能获取字符串字节数,但要注意它不适用于多字节字符(比如中文)。这个函数返回的是字符串的字节长度,不是字符个数。例如一个 UTF-8 编码的中文字符占 3 个字节,strlen("你好") 会返回 6,而不是 2。
什么时候用 strlen 安全
适合处理纯 ASCII 字符串,比如英文、数字、常见符号(a–z、A–Z、0–9、@、_、- 等)。这类字符每个只占 1 字节,strlen 返回值就等于可视字符数。
- 验证用户名、邮箱前缀、API token 等只含英文和数字的字段
- 判断空字符串:
strlen($str) === 0比$str === ''多一次类型转换,但效果一致 - 配合
substr()截取时注意:按字节截,非按字符截
中文或 UTF-8 字符串该用 mb_strlen
PHP 7.1 默认启用 mbstring 扩展(多数环境已开启),推荐用 mb_strlen($str, 'UTF-8') 获取真实字符数。
-
mb_strlen("你好", 'UTF-8')→ 返回 2 - 省略第二个参数可能出错,建议显式指定编码,避免依赖
mb_internal_encoding() - 检查是否可用:
function_exists('mb_strlen')
兼容写法与常见陷阱
如果不能确定字符串编码,或需兼顾老环境,可加简单判断:
立即学习“PHP免费学习笔记(深入)”;
- 先用
mb_detect_encoding($str)猜测编码(不完全可靠,慎用于关键逻辑) - 统一转成 UTF-8 再处理:
mb_convert_encoding($str, 'UTF-8', 'auto') - 别混用:
strlen()和mb_substr()组合会导致截断乱码
不复杂但容易忽略:只要字符串含中文、日文、emoji 或特殊符号,就别依赖 strlen 判长度。



















