PHP 8.3 中不应依赖 mb_internal_encoding() 控制 mb_strlen() 默认编码,因其为全局状态、易被覆盖且违背显式原则;应始终显式传入 'UTF-8',如 mb_strlen($str, 'UTF-8')。

PHP 8.3 中不推荐依赖或设置 mb_internal_encoding() 来控制 mb_strlen() 的默认编码。这个函数仅影响未显式传入 encoding 参数时的 fallback 行为,而这种依赖在 PHP 8.3 及现代开发中已被视为不安全、不可靠且易出错的做法。
为什么不该设 mb_internal_encoding()
mb_internal_encoding() 是全局状态,一旦被修改,会影响当前请求中所有未指定编码的 mb_* 函数调用。它可能被其他库、框架或中间件意外覆盖;CLI 和 Web 环境默认值可能不同;PHP 8.3 更强调显式优于隐式——所以官方实践已转向「始终显式传编码」。
正确做法:显式传 'UTF-8' 给 mb_strlen()
无论你的源字符串来自表单、数据库、文件还是 API,只要确认它是 UTF-8 编码(现代 PHP 环境默认且强烈推荐),就直接写:
mb_strlen($str, 'UTF-8')
立即学习“PHP免费学习笔记(深入)”;
这个写法完全绕过 mb_internal_encoding(),不读取也不修改任何全局配置,结果稳定、可移植、符合 PSR 和现代框架规范。
如果真要初始化(极少数兼容旧代码场景)
仅在脚本最开头、且确定无第三方干扰时,可加一行(但非必需):
- mb_internal_encoding('UTF-8'); —— 仅为兜底,不用于实际逻辑
- 仍需在每个 mb_strlen() 调用中写明
'UTF-8' - 检查扩展是否启用:
extension_loaded('mbstring'),未启用则报错退出
验证编码是否生效的小技巧
运行这段代码即可快速确认环境是否支持:
var_dump(mb_strlen("你好", 'UTF-8') === 2); // 应输出 bool(true)
返回 false?说明 mbstring 未启用,或字符串不是 UTF-8 编码(需先用 mb_convert_encoding() 转换)。



















