是的,mb_substr() 的第三个参数 $length 是按字符数计算的,不是字节数;它能完整处理UTF-8中文、emoji等多字节字符,避免乱码,且必须显式指定"UTF-8"编码以确保跨环境一致。

是的,mb_substr() 的第三个参数 $length 是按「字符数」计算的,不是字节数——这在 PHP 7.4 中完全成立,且与后续版本(包括 PHP 8.x)行为一致。
为什么强调“字符数”很关键
UTF-8 编码下,一个中文、日文或 emoji 通常占多个字节(中文 3 字节,emoji 最多 4 字节),但它们都算作「1 个字符」。mb_substr() 内部识别编码结构,能完整跳过一个汉字的全部字节,不会中途切断。
-
substr("你好", 0, 2)→ 可能输出乱码(只取前 2 字节,“你”的前 2 字节不构成有效 UTF-8) -
mb_substr("你好", 0, 2, "UTF-8")→ 稳定输出“你好”(取前 2 个完整字符)
length 为 null 或省略时的行为
如果第三个参数不传,或者显式传 null,mb_substr() 会从 $start 位置一直截取到字符串末尾:
-
mb_substr("PHP8真强大", 3, null, "UTF-8")→ “真强大” -
mb_substr("PHP8真强大", 3, "UTF-8")→ 效果相同(PHP 允许省略 length)
注意边界情况
当 $length 超出剩余字符数时,函数自动截到末尾,不报错也不补空;若 $start 超出范围(比如大于总字符数),返回空字符串:
立即学习“PHP免费学习笔记(深入)”;
-
mb_substr("abc", 0, 100, "UTF-8")→ “abc”(安全截断,不警告) -
mb_substr("测试", 10, 2, "UTF-8")→ ""(空字符串,非 false 或 null)
务必显式指定编码
PHP 7.4 默认内部编码可能是 ISO-8859-1(尤其旧配置),不传第四个参数容易误判。哪怕项目全用 UTF-8,也建议写死:
- ✅ 推荐:
mb_substr($str, 0, 10, "UTF-8") - ❌ 风险:
mb_substr($str, 0, 10)(依赖 mb_internal_encoding() 当前值)



















