mb_strcut按字节截取并自动回退至字符起始,结果长度可能略少;mb_substr按字符截取,确保完整字符不乱码。前者适用于存储长度限制与高性能场景,后者适合用户可见内容展示。

mb_strcut 和 mb_substr 都用于多字节字符串截取,但底层逻辑完全不同:前者按字节操作,后者按字符操作。
截取单位不同:字节 vs 字符
mb_strcut 从指定字节位置开始,截取指定数量的字节。UTF-8 中一个中文字符占 3 字节,若在第 2 字节处截断,它会自动回退到该字符起始字节再切,但最终长度可能略少于预期(比如要求截 6 字节,实际返回 3 或 5 字节的有效字符)。
mb_substr 则始终以“字符”为单位计数。无论中英文混合还是 emoji,它都识别完整字符边界,确保输出不会出现半个汉字或乱码。
- 示例:
$str = "百度智能云" -
mb_substr($str, 0, 2, 'UTF-8')→ 输出 "百度"(2 个字符) -
mb_strcut($str, 0, 6, 'UTF-8')→ 输出 "百度"(6 字节刚好够 2 个中文字符,共 6 字节) -
mb_strcut($str, 0, 5, 'UTF-8')→ 仍输出 "百度"(5 字节不够第 3 字符,不强行截断)
适用场景不同
需要精确控制显示字符数(如标题摘要、前端展示)——用 mb_substr;
立即学习“PHP免费学习笔记(深入)”;
需要严格限制存储长度(如数据库字段最大 255 字节)、或对性能敏感(如日志批量处理)——用 mb_strcut。
- mb_strcut 在 PHP 7.4 下比 mb_substr 快约 15%,但有小概率因编码边界判断导致结果偏短
- mb_substr 更安全稳定,适合用户可见内容,尤其含中文、emoji、双向文本时
负参数和越界行为相似但含义不同
两者都支持负的 $start 和 $length,但计算基准不同:
-
mb_substr($str, -3, 2):从倒数第 3 个字符开始,取 2 个字符 -
mb_strcut($str, -6, 4):从倒数第 6 字节开始,最多取 4 字节(可能只取到 1 个完整中文字符) - 当起始位置超出字符串长度,两者均返回空字符串,而非 false
编码依赖与扩展要求
两个函数都依赖 mbstring 扩展,必须启用才能使用。编码参数(如 'UTF-8')不可省略或需确保与字符串真实编码一致,否则结果不可预测。
- 未指定 encoding 时,默认使用
mb_internal_encoding()的值 - 混用 GBK 字符串却传 'UTF-8',会导致截取错位甚至空结果
- 建议统一项目编码为 UTF-8,并显式传参,避免隐式依赖



















