PHP截取字符串应优先使用mb_substr()按字符截取以支持中文:substr()按字节操作易致UTF-8中文乱码;mb_substr()需指定'UTF-8'编码且依赖mbstring扩展;其他函数如mb_strcut()虽不乱码但长度不精确。

PHP截取字符串取决于你用哪个函数:
-
substr()是按字节截取 -
mb_substr()是按字符截取(支持中文等多字节字符)
✅ substr():字节级操作,中文容易出乱码
它不识别编码,只数字节。UTF-8 中一个中文占 3 字节,若从中间切开,就会输出残缺字节,显示为 或其他乱码。
例如:
$str = "你好世界"; echo substr($str, 0, 3); // 可能输出 "你" —— 因为只取了“你”的前 3 字节(刚好是“你”),但若原串是"你好",取 4 字节就可能卡在“好”的中间。
✅ mb_substr():字符级操作,中文安全
它知道“一个汉字就是一个字符”,会完整跳过整个 UTF-8 编码单元。
必须显式指定编码(推荐 'UTF-8'),否则依赖内部编码,可能不稳定:
$str = "你好世界"; echo mb_substr($str, 0, 2, 'UTF-8'); // 输出:"你好"
⚠️ 注意:
mbstring扩展需启用;否则调用mb_substr()会报错。
? 其他相关函数对比
-
str_split():按字节拆分 → 中文会被劈开 -
mb_str_split():按字符拆分 → 支持指定编码,适合中文数组化 -
mb_strcut():按字节截取,但会自动舍弃不完整的多字节字符 → 不乱码,但长度不精确(按字符数预期时慎用)
? 实用建议
- 处理含中文、日文、emoji 的字符串,一律优先用
mb_substr() - 截取前可用
mb_strlen($str, 'UTF-8')获取真实字符长度,避免越界 - 用户输入不确定编码时,先做统一转码:
$str = mb_convert_encoding($str, 'UTF-8', 'auto');
不复杂但容易忽略。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











