正确使用 mb_substr() 解决乱码需启用 mbstring 扩展、显式指定编码(如 'utf-8')、区分 mb_substr(按字符截取)与 mb_strcut(按字节截取),并避免混用 strlen/substr 或忽略 bom。

直接用 mb_substr() 就能解决乱码,但前提是用对——不是加了函数就万事大吉,关键在编码参数和扩展启用。
确保 mbstring 扩展已开启
这是前提,否则调用会报错或直接失效:
- 检查 php.ini 中是否启用了
extension=mbstring(PHP 8.0+ 默认启用,旧版本需手动取消注释) - 运行
phpinfo(),搜索 mbstring 确认模块已加载 - 若未启用,修改后需重启 Web 服务(如 Apache 或 php-fpm)
必须显式指定编码参数
不能依赖默认值,尤其当脚本编码、文件保存编码、HTTP 响应编码不一致时:
- UTF-8 字符串务必写明
'utf-8':mb_substr($str, 0, 10, 'utf-8') - 避免使用
mb_internal_encoding()作默认,它可能被其他代码意外修改 - 中文 GBK 编码环境则用
'gbk',但强烈建议统一转为 UTF-8
注意 mb_substr 和 mb_strcut 的区别
两者都安全,但逻辑不同,选错仍可能“看起来像乱码”:
-
mb_substr():按字符数截取(推荐用于显示摘要)
例:mb_substr('你好世界', 0, 2, 'utf-8')→ 你好 -
mb_strcut():按字节数截取(适合协议层或存储限制)
例:mb_strcut('你好世界', 0, 6, 'utf-8')→ 你好(6 字节刚好两个汉字)
但mb_strcut('你好世界', 0, 7, 'utf-8')→ 你好(第 7 字节落在第三个汉字中间,自动舍弃)
避免常见误操作
这些看似合理,实则埋雷:
- 混用
strlen()和mb_substr():前者返回字节数,后者按字符数切,长度不能直接套用 - 对已截断字符串再次用
substr()处理:哪怕前一步用了mb_substr(),后续再用substr()仍可能切坏 - 忽略 BOM 或不可见控制字符:UTF-8 文件带 BOM 时,开头三个字节会影响起始位置计算,建议保存为无 BOM 的 UTF-8
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











