PHP 7.4 中 mb_substr() 默认使用 mb_internal_encoding() 返回的内部编码,其优先级为:显式调用 > php.ini 配置 > 默认 ISO-8859-1;未设 UTF-8 会导致中文截断乱码,故应始终显式传入 'UTF-8'。

PHP 7.4 中,mb_substr() 不显式传入 $encoding 参数时,**默认使用当前的内部字符编码(internal encoding)**,即由 mb_internal_encoding() 返回的值。
内部编码是怎么确定的?
它通常在 PHP 启动时或脚本运行中被设置,优先级如下:
- 如果调用了
mb_internal_encoding('UTF-8'),那就以该值为准; - 如果没有手动设置,会读取
php.ini中的mbstring.internal_encoding配置项; - 若
php.ini未配置,PHP 7.4 默认 fallback 为 ISO-8859-1(不是 UTF-8!)
为什么这很危险?
很多项目实际用 UTF-8 存储和传输中文,但若没设 internal encoding,mb_substr($str, 0, 5) 就会按 ISO-8859-1 解析 —— 导致中文被错误拆分、返回空或乱码。例如:
隐患代码:
$s = "你好world";
echo mb_substr($s, 0, 5); // 结果不可预测:可能截出半个汉字,甚至空字符串
安全写法:始终显式指定编码
无论 PHP 版本或 ini 配置如何,都应明确传入 'UTF-8':
mb_substr($s, 0, 5, 'UTF-8')mb_strlen($s, 'UTF-8')- 两个函数的编码参数必须一致,否则长度与截取结果无法可靠比较
顺手检查当前 internal encoding
调试时可用:
echo mb_internal_encoding(); // 查看当前值<br>mb_internal_encoding('UTF-8'); // 建议在入口文件开头统一设置
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











