PHP 7.4 中 mb_substr() 用法与早期一致但性能更优,专为多字节字符设计,需显式指定 'UTF-8' 编码以避免乱码和环境不一致问题,支持负数起始位置、null 长度及安全截取。

PHP 7.4 中 mb_substr() 的用法和早期版本一致,但性能更优、稳定性更强。它专为多字节字符(如 UTF-8 编码的中文、日文、emoji 等)设计,能按“字符”而非“字节”精准截取,彻底避免乱码。
核心参数要写全,尤其是编码
虽然 mb_substr($str, $start, $length) 可以省略 $encoding,但在 PHP 7.4 实际项目中强烈建议显式传入 'UTF-8':
- 避免依赖
mb_internal_encoding()的运行时配置,线上环境容易不一致 - 防止因服务器默认编码不是 UTF-8 导致中文变问号或截断异常
- 代码可读性高,后续维护者一眼看懂编码意图
常见用法示例(UTF-8 环境下)
截前 N 个字符:
例如提取标题前 12 个字,自动兼容中英文混合$title = "PHP 7.4 新特性详解:性能提升与 mbstring 优化";<br>echo mb_substr($title, 0, 12, 'UTF-8'); // 输出:PHP 7.4 新特性详
从末尾倒取:
负数$start 表示从右往左数,仍按字符计数
$path = "/var/www/html/index.php";<br>echo mb_substr($path, -7, 3, 'UTF-8'); // 输出:"ind"
截到末尾(省略 length):
$desc = "这是一个简短描述";<br>echo mb_substr($desc, 4, null, 'UTF-8'); // 输出:"简短描述"<br>// 注意:PHP 7.4 支持传 null,等效于不传
必须避开的坑
别混用 strlen() 和 mb_substr()
-
strlen(mb_substr($s, 0, 10, 'UTF-8'))返回的是字节数(比如“你好”占 6 字节),不是字符数 - 要判断“是否真有 10 个字符”,必须用
mb_strlen(..., 'UTF-8')
长度超出也不报错,但行为要心里有数
-
mb_substr("abc", 0, 100, 'UTF-8')安全返回"abc",不会警告或截空 - 适合做“最多取 N 字”逻辑,无需提前
mb_strlen()判断长度
小技巧:和 mb_strlen 配套使用最稳妥
比如做摘要并加省略号:
$text = "PHP 多字节处理是 Web 国际化的基石";<br>$excerpt = mb_substr($text, 0, 15, 'UTF-8');<br>if (mb_strlen($excerpt, 'UTF-8') $excerpt .= '…';<br>}<br>// 输出:PHP 多字节处理是 Web 国际化…
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











