Laravel返回JSON中文乱码主因是Windows环境下编码链路断裂,需统一PHP文件(UTF-8无BOM)、Apache响应头(AddDefaultCharset utf-8)、MySQL连接(utf8mb4+SET NAMES)、Artisan终端(chcp 65001),并用response()->json($data, 200, [], JSON_UNESCAPED_UNICODE)确保中文不转义。

Laravel 返回 JSON 出现中文乱码,问题通常不在 Laravel 本身,而在于环境编码链路断裂——尤其是使用 Laragon 这类 Windows 本地开发环境时,PHP、终端、Web 服务器(nginx/Apache)和文件系统之间的 UTF-8 协调容易出错。Laragon 默认配置虽友好,但不自动解决所有编码场景,需针对性调整。
确认乱码本质是 JSON 字符串被错误解码
不是数据库或模型没读出中文,而是响应体中的中文在传输或显示环节被当成了 GBK/ANSI 解析。典型表现:
• 浏览器开发者工具 Network → Response 显示正常中文,但前端 console.log(res) 打印出 \u4f60\u597d 或方块
• Postman 显示乱码,但用 curl -H "Accept: application/json" http://... 查看原始响应却是正常 UTF-8 字节
• 记事本打开返回的 .json 文件显示“?”或空白——大概率是文件被保存为 UTF-8 with BOM(Windows 记事本老毛病)
Laragon 环境下的关键设置点
• PHP 文件本身必须存为 UTF-8 无 BOM:控制器、Resource、配置文件等所有 .php 文件,用 VS Code / Notepad++ 等编辑器另存为 “UTF-8”(明确勾选“无 BOM”),别选“UTF-8 with BOM”
• Apache/Nginx 响应头强制声明 charset:Laragon 默认 Apache 配置中,可在 laragon/etc/apache2/conf.d/charset.conf 添加一行:AddDefaultCharset utf-8
重启 Apache 生效。这确保即使 response()->json() 没显式设 header,Content-Type 也带 ; charset=utf-8
• MySQL 连接层统一 UTF-8:在 .env 中确认:DB_CONNECTION=mysqlDB_CHARSET=utf8mb4DB_COLLATION=utf8mb4_unicode_ci
并在 config/database.php 的 mysql 配置里补上:'options' => [PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4"]
• Artisan 终端编码修正(Windows 必做):Laragon 自带终端默认用 CMD,编码为 GBK。打开 Laragon 主界面 → Menu → Terminal → Edit startup script,在开头插入:@chcp 65001 >nul
这样每次启动终端自动切到 UTF-8,避免 php artisan tinker 或日志输出乱码
详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
代码层防乱码的硬性写法
• 用 response()->json(),别手动 json_encode() + header()
• 中文不转 Unicode:显式加 JSON 编码选项return response()->json($data, 200, [], JSON_UNESCAPED_UNICODE);
• 若用 API Resource,确保 toArray() 返回的是原生中文字符串,不要提前 utf8_encode() 或其它转换
• 避免在中间件或控制器里 echo、var_dump() 后忘记 exit——一旦 HTTP 头发出,后续 JSON 就会变成纯文本拼接
快速验证是否修复成功
• 写一个测试路由:Route::get('/test-json', function () { return response()->json(['msg' => '你好世界', 'data' => ['name' => '张三']], 200, [], JSON_UNESCAPED_UNICODE); });
• 用 curl 直接测原始响应:curl -H "Accept: application/json" http://your-app.test/test-json | hexdump -C | head -5
看到 e4 bd a0(“你”字 UTF-8 编码)而非 ef bb bf(BOM)或 c4 e3(GBK),就说明编码链路通了

















