ThinkPHP 5.1 中文乱码主因是编码链路未统一,需全程强制 UTF-8:确认 mbstring 启用并设 internal_encoding 为 UTF-8,注释 func_overload,替换 substr 等为带 'UTF-8' 参数的 mb_ 函数,并同步校验文件、HTTP 头、数据库连接及 HTML 元标签编码。

ThinkPHP 5.1 老项目出现中文乱码,多数不是 mbstring 没开,而是编码链路没对齐——从文件保存、PHP 内部处理、HTTP 输出到数据库连接,任一环节掉链子都会触发乱码。修复核心是统一 UTF-8,并禁用已废弃的重载机制。
确认 mbstring 已启用且内部编码设为 UTF-8
先验证扩展是否加载:
- 运行
php -m | grep mbstring,输出mbstring表示已启用 - 检查关键配置:执行
php -i | grep -E "(mbstring.internal_encoding|mbstring.language)" - 若
mbstring.internal_encoding显示no value或非UTF-8,需在php.ini中显式设置:mbstring.internal_encoding = UTF-8mbstring.language = neutral - 也可在入口文件(如
public/index.php)最开头加:mb_internal_encoding('UTF-8');
禁用已被移除的 func_overload 配置
PHP 8.0+ 已彻底删除 mbstring.func_overload,但 TP5.1 依赖的旧组件仍会尝试读取它,引发弃用警告甚至干扰字符串函数行为:
- 打开
php.ini,搜索mbstring.func_overload - 将其整行注释或删除(例如改为
;mbstring.func_overload = 0) - 重启 PHP 服务后,再执行
php -i | grep func_overload,应无任何输出 - 额外建议:在项目启动处加
ini_set('mbstring.func_overload', 0);双保险
替换所有原生字符串函数为 mb_ 版本
TP5.1 自身未全面使用 mb_ 函数,尤其在自定义逻辑、验证器、分页截取等场景中混用 substr()、strlen() 等,极易导致中文被截断:
- 查找项目中所有
substr(、strlen(、strpos(、strrpos(调用 - 统一替换为对应
mb_函数,并显式传入编码:mb_substr($str, 0, 10, 'UTF-8')mb_strlen($str, 'UTF-8')mb_strpos($str, '关键词', 0, 'UTF-8') - 注意:不要依赖
mb_internal_encoding()的全局设定,每次调用都带'UTF-8'更可靠
同步检查上下游编码一致性
mbstring 只管 PHP 层字符串操作,乱码常来自外部环节:
- PHP 文件本身:用编辑器确认保存为 UTF-8 无 BOM(VS Code / PhpStorm 右下角可切换)
-
HTTP 响应头:在
index.php或框架初始化处加header('Content-Type: text/html; charset=utf-8'); -
数据库连接:确保 PDO 或 MySQLi 连接时指定了
charset=utf8mb4,例如 DSN 中写mysql:host=localhost;dbname=test;charset=utf8mb4 -
HTML 页面:模板中必须有
<meta charset="UTF-8"> -
JSON 输出:用
json_encode($data, JSON_UNESCAPED_UNICODE)避免中文转义


















