Workerman 4 返回 JSON 必须显式设置 Content-Type 为 application/json; charset=utf-8,否则易致中文乱码或解析失败;需在 $response->end() 前调用 $response->header(),并推荐使用 JSON_UNESCAPED_UNICODE 和 JSON_UNESCAPED_SLASHES 优化输出。

Workerman 4 中使用 HTTP 协议返回 JSON 数据时,若不显式设置 Content-Type 为 application/json; charset=utf-8,浏览器或客户端可能默认按 ISO-8859-1 解析,导致中文乱码或 JSON 解析失败。
手动设置 Content-Type 头
在响应前调用 $response->header() 显式声明类型和编码:
- 必须包含
charset=utf-8,否则 PHP 默认输出无编码声明,部分客户端会误判 - 不要只写
application/json,省略 charset 容易触发旧版浏览器或严格模式下的解析异常 - 建议在
json_encode()后立即设置,避免中间逻辑干扰响应头
正确返回 JSON 的典型写法
以 Workerman 4 的 WebServer 或 HttpServer 为例:
$response->header('Content-Type', 'application/json; charset=utf-8');
$response->end(json_encode([
'code' => 0,
'msg' => '操作成功',
'data' => ['name' => '张三']
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
-
JSON_UNESCAPED_UNICODE确保中文不被转成\uXXXX,提升可读性且减少体积 -
JSON_UNESCAPED_SLASHES避免斜杠被转义,对 URL 字段更友好 - 务必在
$response->end()前设置 header,否则无效
全局统一处理(推荐)
若项目中大量返回 JSON,可封装一个响应工具方法:
- 定义静态函数如
JsonResponse::send($response, $data, $code = 0) - 内部统一设置 header、编码选项和状态码
- 避免每个路由重复写 header + json_encode 组合,降低出错概率
调试与验证方式
确认是否生效的简单方法:
- 用浏览器开发者工具 → Network → 查看响应头中
Content-Type是否含charset=utf-8 - cURL 测试:
curl -I http://your-api检查 header 输出 - 用 Postman 查看 “Headers” 标签页,确认类型和编码完整显示


















