必须显式指定'UTF-8'编码参数,因mb_substr()不自动识别字符串编码,否则中文易乱码或截取错位;负数offset更需指定,避免字节级错误;不可控来源应先用mb_detect_encoding检测编码。

直接在 mb_substr() 的第四个参数传入 'UTF-8' 即可,这是最明确、最安全的做法。
必须显式写 encoding 参数
PHP 不会自动识别字符串编码,即使你用的是 UTF-8 文件、数据库也设了 utf8mb4,mb_substr() 仍可能按默认编码(如 ISO-8859-1)处理,导致中文变乱码或截取错位。
- ✅ 正确写法:
mb_substr("你好世界", 0, 4, 'UTF-8') - ❌ 错误写法:
mb_substr("你好世界", 0, 4)(依赖内部编码,不可靠) - ⚠️ 不推荐:
mb_internal_encoding('UTF-8'); mb_substr("你好世界", 0, 4)(全局设置易被覆盖,不隔离)
负数 offset 截取末尾时更要指定 UTF-8
负数起始位置依赖准确的字符计数。UTF-8 中一个中文占 3 字节,但算作 1 个字符;没指定编码,函数可能按字节倒推,结果完全错误。
-
mb_substr("Hello?", -1, 1, 'UTF-8')→ 返回完整 emoji ? -
mb_substr("Hello?", -1, 1)→ 可能只取到 emoji 的最后一个字节,显示为乱码或空
不确定编码时先检测再传参
如果字符串来源不可控(如用户输入、旧系统接口),可用 mb_detect_encoding() 辅助判断:
$encoding = mb_detect_encoding($str, ['UTF-8', 'GB2312', 'BIG5'], true); if ($encoding === false) $encoding = 'UTF-8'; // 默认兜底 $result = mb_substr($str, -3, 2, $encoding);
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











