PHP字符串截取应优先使用mb_substr按字符截取以避免乱码,substr按字节仅适用于纯ASCII场景,mb_strcut按字节硬切适用于定长存储但可能破坏语义。

PHP里常用的字符串截取函数主要有三个:substr、mb_substr 和 mb_strcut。处理含中文、日文、emoji 等多字节字符的字符串时,选错函数容易导致乱码或截断错误——关键不在“能不能用”,而在“按什么单位切”。
substr:按字节截取,简单但危险
substr 是最基础的截取函数,底层只认字节,不识别字符边界。在 UTF-8 编码下,一个中文占 3 字节,一个英文字母占 1 字节。如果起始或长度落在某个中文字符中间,就会切出半个字符,显示为或乱码。
-
示例:
$str = "Hello世界"; echo substr($str, 0, 6);→ 输出"Hello"("世"字被截断) - 适合纯 ASCII 场景(如英文、数字、符号),或已确认字符串不含多字节字符
- 性能略高,但安全边界极窄,不建议用于用户输入或国际化文本
mb_substr:按字符截取,推荐首选
mb_substr 是专为多字节编码设计的安全函数,它会解析编码规则(如 UTF-8),把每个中文、日文、emoji 都当作一个完整字符来计数和截取,彻底避免乱码。
-
必须指定编码:第四个参数如
'UTF-8',否则依赖mb_internal_encoding()设置,易出错 -
支持负索引:如
mb_substr($str, -4, 2, 'UTF-8')表示从倒数第 4 个字符起取 2 个 -
长度省略即截到末尾:
mb_substr($str, 5, null, 'UTF-8')等价于mb_substr($str, 5, '', 'UTF-8') - 需确保服务器启用了
mbstring扩展(可通过extension=mbstring在 php.ini 中开启)
mb_strcut:按字节物理截取,慎用
mb_strcut 看似和 mb_substr 参数一样,但它不是按字符,而是按字节做“硬切”。遇到多字节字符跨边界时,会自动用替代符(如 ?)补全,不保证语义完整。
- 典型场景:日志截断、数据库字段长度硬限制(如 VARCHAR(20))、生成固定宽度摘要
-
风险提示:
mb_strcut("你好世界", 0, 5, 'UTF-8')可能输出"你好?"(5 字节刚好卡在“世”的开头) - 性能比 mb_substr 略快(约 15%–30%),但牺牲了可读性与准确性
怎么选?一句话判断标准
要显示给人看 → 用 mb_substr(保字符完整);
要存进定长字段或做底层协议处理 → 可考虑 mb_strcut(需自行校验结果);
确定全是英文/数字/ASCII 符号 → substr 可用,但建议统一用 mb_substr 免留隐患。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











