thinkphp 8.0 中文乱码本质是编码链路不统一,需全链路统一 utf-8(无 bom)+ utf8mb4:文件编码、http 响应头、html meta、数据库(utf8mb4)、表单 accept-charset 及导出字体均须严格一致。

ThinkPHP 8.0 中文乱码本质是编码链路不统一,不是单点问题。从文件、传输、数据库到输出,任一环节用错编码(比如 UTF-8 和 GBK 混用),都会导致中文显示为问号、方块或乱码符号。解决关键是让整个流程严格使用 UTF-8(推荐无 BOM) + utf8mb4。
文件编码必须是 UTF-8(无 BOM)
ThinkPHP 8.0 默认按 UTF-8 解析 PHP 文件。如果源码文件本身存为 GBK 或带 BOM 的 UTF-8,PHP 解析时会把 BOM 当作输出内容,触发 “headers already sent” 错误,后续 header 设置失效,浏览器就按默认编码(如 ISO-8859-1)渲染,必然乱码。
- 用 VS Code / Sublime / Notepad++ 打开所有
.php文件(尤其入口index.php、控制器、模型) - 查看右下角编码标识,如果不是 UTF-8(无 BOM),点击切换 → “另存为” → 选择 UTF-8(无 BOM)
- Linux 下可批量检查:
file -i *.php | grep -v 'utf-8$' - 特别注意:
vendor/下第三方包一般无需改,但自定义类、模板、配置文件务必统一
HTTP 响应头和 HTML 元信息要显式声明 UTF-8
仅靠文件编码不够,浏览器需要明确知道该用什么编码解析响应体。
- 在
public/index.php入口文件最顶部(任何echo、print、HTML 输出之前)添加:header('Content-Type: text/html; charset=utf-8'); - 在所有 HTML 模板(
.html或.php视图)的内第一行加:<meta charset="UTF-8">
- 不要用
<meta http-equiv="Content-Type" ...>,它优先级低于 HTTP 头,且易被 CDN 或代理覆盖
数据库连接与结构必须用 utf8mb4
MySQL 的 utf8 实际是 utf8mb3,不支持 emoji 和部分生僻汉字;utf8mb4 才是真正的 UTF-8 实现。
- 创建数据库时指定:
CREATE DATABASE myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- 数据表和字段也设为
utf8mb4:ALTER TABLE user CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- ThinkPHP 8.0 的数据库配置(
config/database.php)中,确保 DSN 包含charset=utf8mb4:'dsn' => 'mysql:host=127.0.0.1;dbname=myapp;charset=utf8mb4',
- 如果用 PDO,也可在
options中补充:PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4"
表单提交和 URL 参数需正确编码
用户输入的中文若没按 UTF-8 提交,后端收到的就是乱码字节。
- 所有
<form></form>标签加上accept-charset="UTF-8": - URL 中含中文参数(如搜索词、分页关键词)时,前端需
encodeURIComponent()编码,后端 TP8 一般能自动解码;若仍有问题,可在中间件中统一处理:// app/middleware/CharsetFix.php public function handle($request, \Closure $next) { array_walk_recursive($_GET, function (&$v) { if (is_string($v) && !mb_check_encoding($v, 'UTF-8')) { $v = mb_convert_encoding($v, 'UTF-8', 'GBK'); } }); return $next($request); }
PDF 或 Word 导出中文乱码要加载中文字体
使用 dompdf/dompdf 或 phpoffice/phpword 时,乱码通常是因为缺字体。
- 下载一个支持中文的 TrueType 字体(如
simhei.ttf或NotoSansCJKsc-Regular.otf) - 将字体文件放入项目根目录
fonts/下 - 运行官方
load_font.php工具(需先require vendor/autoload.php),将字体注册进 DOMPDF:php load_font.php "SimHei" fonts/simhei.ttf
- 在 HTML 模板中用 CSS 指定字体:
<style>body { font-family: "SimHei", sans-serif; }</style>
不复杂但容易忽略
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











