php8中截取中文应使用mb_substr()函数,因其按字符而非字节操作,可避免utf-8下中文乱码;需显式指定'utf-8'编码,起始位置从0计,负数表示倒序,配合mb_strlen校验长度更安全。

PHP8 中用 mbstring 截取中文,核心是使用 mb_substr() 函数——它按「字符」而非「字节」计数,天然适配 UTF-8 下的中文,不会出现乱码或截断半个汉字的问题。
为什么必须用 mb_substr() 而不是 substr()
substr() 是单字节操作函数。在 UTF-8 编码中,一个中文字符占 3 个字节,substr() 若从中间字节切开,就会输出乱码(如 )。而 mb_substr() 知道“一‘个’中文是一个字符”,能精准按字符位置截取。
- 不指定编码时,默认使用内部编码(可用
mb_internal_encoding()查看或设置) - 显式传入
'UTF-8'更稳妥,尤其在多语言混合或编码不确定时 - 起始位置从 0 开始,负数表示从末尾倒数(例如 -2 表示倒数第 2 个字符)
基本用法:截取固定长度中文
比如截取字符串前 5 个中文字符:
$str = '欢迎来到PHP8的世界!'; $result = mb_substr($str, 0, 5, 'UTF-8'); // → '欢迎来到P'
- 第 1 参数:原字符串
- 第 2 参数:起始字符偏移(0 表示开头)
- 第 3 参数:要取的字符数(不是字节数)
- 第 4 参数:编码,强烈建议显式写上
'UTF-8'
进阶技巧:安全处理边界和空值
避免因长度超限返回空串或警告,可加简单判断:
- 用
mb_strlen($str, 'UTF-8')先获取真实字符长度,再决定是否截取 - 当
$length为 null 或省略时,mb_substr()自动截到末尾 - 若
$start超出范围(如大于字符串长度),函数返回空字符串,不会报错 - 对用户输入等不可信字符串,建议先用
mb_convert_encoding($str, 'UTF-8', 'auto')统一转码
替代方案:按显示宽度截断(带省略号)
如果目标是前端展示限制宽度(比如标题最多显示 20 像素宽),可用 mb_strimwidth():
$title = 'PHP8新增了大量字符串处理优化特性'; $short = mb_strimwidth($title, 0, 20, '…', 'UTF-8'); // 半角算1,全角算2
- 该函数按「视觉宽度」计数(中文=2单位,英文字母/数字=1单位)
- 第 4 参数
'…'会在截断处自动追加,更友好 - 注意:PHP 8.3.0+ 已弃用负 width 参数,务必用正数
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











