php 8.0 中 substr() 按字节截取,对中文等多字节字符不安全,易乱码;应改用 mb_substr() 按字符截取,并显式指定 utf-8 编码。

基本语法和参数含义
substr(string, start, length) 从指定位置开始截取子字符串:
- string:要处理的原始字符串
- start:起始位置(从 0 开始;负数表示从末尾倒数)
- length(可选):截取长度;省略则取到末尾;负数表示从末尾排除多少个字符
常见截取场景示例
假设 $str = "Hello世界123";
-
substr($str, 0, 5)→"Hello"(前5个字节) -
substr($str, -3)→"123"(最后3个字节) -
substr($str, 5)→"世界123"(从第5字节起全部) -
substr($str, 5, 6)→ 可能是"世界1"或乱码(因为“世”占3字节,“界”占3字节,6字节刚好两个汉字,但若错位切在中间就会出问题)
中文等多字节字符串请用 mb_substr()
PHP 8.0 默认启用 mbstring 扩展,推荐用 mb_substr() 替代,按字符而非字节计数:
-
mb_substr($str, 0, 5, 'UTF-8')→"Hello世"(前5个 Unicode 字符) -
mb_substr($str, -3, null, 'UTF-8')→"123"(最后3个字符) - 第三个参数
null表示取到末尾,比留空更明确
注意边界和返回值
substr() 在越界时不会报错,而是按实际可截取范围处理:
- 起始位置超出字符串长度 → 返回空字符串
"" - length 为 0 或负数且绝对值大于剩余长度 → 返回空字符串
- 建议使用
mb_strlen($str, 'UTF-8')先判断长度再操作,避免意外空结果
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











