mb_substr()能彻底解决中文截取乱码,因其按字符而非字节操作:substr("你好",0,2)取前2字节致乱码,而mb_substr("你好",0,1,"UTF-8")准确返回"你",需显式指定编码并确保mbstring扩展已启用。

直接用 mb_substr() 替代 substr(),并显式传入 'UTF-8' 编码参数,就能彻底解决中文截取乱码问题。
为什么 substr() 截中文会乱码
因为 substr() 是按字节操作的。在 UTF-8 编码下,一个中文字符占 3 个字节。比如字符串 "你好" 实际是 6 字节,substr("你好", 0, 2) 会只取前 2 个字节——这刚好是第一个汉字的前半部分,浏览器无法解析,就显示成乱码(如 )。
mb_substr() 则按“字符”计数,知道 "你好" 是 2 个字符,mb_substr("你好", 0, 1, 'UTF-8') 就稳稳返回 "你",不会切开任何汉字。
mb_substr() 正确写法和关键细节
基本语法:mb_substr($string, $start, $length, $encoding)
-
第四个参数必须写上
'UTF-8':不写可能依赖服务器默认编码,存在隐患;显式声明最稳妥 -
起始位置从 0 开始:
mb_substr($str, 0, 5, 'UTF-8')表示取前 5 个字符 -
长度单位是“字符”,不是字节:中英文混合也没问题,
mb_substr("Hello你好", 0, 5, 'UTF-8')返回"Hello你" -
$length 可省略或为 null:表示截取到末尾,
mb_substr($str, 3, null, 'UTF-8')等价于从第 4 个字符开始取完
安全截取的实用建议
避免因长度超限导致意外(比如返回空串),推荐先校验再操作:
- 用
mb_strlen($str, 'UTF-8')获取真实字符数,再判断是否需要截取 - 对用户输入等不可靠字符串,可先做统一转码:
$safe = mb_convert_encoding($input, 'UTF-8', 'auto') - 若需加省略号(如“标题太长…”),可用
mb_strimwidth($str, 0, 20, '…', 'UTF-8'),它自动按显示宽度处理
确认 mbstring 扩展已启用
如果调用 mb_substr() 报错 “function undefined”,说明 PHP 没开启 mbstring 扩展:
- Linux / macOS:检查
php.ini中是否有extension=mbstring(取消注释) - Windows:确认
php_mbstring.dll存在且extension=php_mbstring.dll已启用 - 命令行执行
php -m | grep mbstring或网页中调用phpinfo()查看是否列出 mbstring
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











