关键在于编码一致、参数对齐、函数启用三者缺一不可;需确认mbstring扩展已开启,否则mb_substr()会报“undefined function”错误,并按系统环境启用该扩展。

用 mb_substr() 截取中文字符串,关键不是“怎么写”,而是“怎么配”——编码一致、参数对齐、函数启用,三者缺一不可。
确认 mbstring 扩展已开启
PHP 默认可能未启用多字节字符串处理模块。若直接调用 mb_substr() 报错 “undefined function”,说明扩展未加载。
- Windows:检查
php.ini中是否取消了;extension=mbstring的注释 - Linux(如 Ubuntu):运行
sudo apt install php-mbstring,再重启 Web 服务(如sudo systemctl restart apache2或sudo service php-fpm restart) - 验证方式:在 PHP 文件中写
<?php var_dump(function_exists('mb_substr'));,返回bool(true)即成功
确保源字符串编码与 mb_substr() 声明编码一致
乱码绝大多数源于“以为是 UTF-8,实际是 GBK”,或反之。不能只看文件保存格式,还要看数据来源(数据库、表单、API)。
- 统一使用 UTF-8 是最稳妥方案:PHP 文件保存为 UTF-8 无 BOM;HTML 加
<meta charset="UTF-8">;MySQL 连接执行SET NAMES utf8mb4 - 调用时显式指定编码:
mb_substr($str, 0, 10, 'UTF-8')—— 第四个参数必须写,不能依赖默认值 - 不确定编码?先用
mb_detect_encoding($str, ['UTF-8', 'GBK', 'BIG5'], true)探测(注意:该函数不完全可靠,仅作参考)
正确使用 mb_substr() 截取中文
它和 substr() 行为相似,但按字符计数而非字节,因此能安全处理中文、emoji 等多字节字符。
立即学习“PHP免费学习笔记(深入)”;
- 基本语法:
mb_substr($string, $start, $length, $encoding) - 截前 5 个汉字:
mb_substr($text, 0, 5, 'UTF-8') - 从第 3 个字符起截 8 个:
mb_substr($text, 2, 8, 'UTF-8')(注意:起始位置从 0 开始) - 省略 $length 则截取到末尾:
mb_substr($text, 3, null, 'UTF-8')或直接写mb_substr($text, 3, '', 'UTF-8')
常见陷阱与绕过技巧
有些场景下 mb_substr() 仍会出人意料,比如含 emoji 或中英文混排时长度判断偏差。
- emoji 占多个 Unicode 码位(如 ? 是 U+1F30D),但多数 UTF-8 环境下
mb_strlen()能正确计为 1 个字符,mb_substr()也正常 —— 前提是编码设为'UTF-8',不是'utf8'(少写 mb 会失败) - 避免用
strlen()或substr()处理中文,它们按字节操作,中文会被砍成乱码(如 GBK 下一个汉字占 2 字节,UTF-8 下占 3 字节) - 如果必须兼容老旧环境且无法启用 mbstring,可用
iconv_substr()替代(需 iconv 扩展),但推荐优先修复环境而非降级方案
不复杂但容易忽略:一次配对成功,后续所有中文截取就稳了。



















