codeigniter 3 中需同时设置 header('content-type: application/json; charset=utf-8') 和 json_encode($data, json_unescaped_unicode) 才能正确输出中文;ci4 中必须 return $this->response->setjson($data) 否则无输出,且跨域需手动添加 cors 响应头。

CodeIgniter 3 中 json_encode() 输出中文乱码
直接用 json_encode($data) 输出中文,浏览器看到的是 \u4f60\u597d 这种 Unicode 转义,不是乱码,但不符合前端直读需求。根本原因是 PHP 原生 json_encode() 默认不处理 UTF-8 多字节字符的编码方式,而 CodeIgniter 3 的默认输出未设响应头。
- 必须手动加
header('Content-Type: application/json; charset=utf-8'),否则浏览器按 ISO-8859-1 解析 -
json_encode($data, JSON_UNESCAPED_UNICODE)是关键参数,漏掉就全是\uXXXX - 别在控制器里 echo 后再 exit —— CodeIgniter 的输出类可能已缓存或覆盖 header
CodeIgniter 4 的 setJSON() 方法为何返回空白页
调用 $this->response->setJSON($data) 却没输出?大概率是忘了 return $this->response。CI4 的响应对象是“构建后需显式返回”的链式设计,不是自动输出。
- 必须写
return $this->response->setJSON($data),否则响应体被丢弃 - 如果之前调用了
$this->output->set_content_type()或其他输出操作,会干扰setJSON()自动设置的 header -
setJSON()默认带JSON_PRETTY_PRINT,调试时好看,上线前建议关掉(加第二个参数false)
CI3 里用 output->set_output() 输出 JSON 的风险
有人图省事在 CI3 控制器里写 $this->output->set_output(json_encode($data)),看似能用,但隐患明显:header 没同步设、字符集没声明、后续钩子可能篡改输出。
- 它绕过了
output->set_content_type('application/json'),导致前端 fetch() 的response.json()报错:Unexpected token - 若开启 output 缓存,
set_output()写入的是原始字符串,不会触发 JSON 相关的自动转义或压缩逻辑 - 更稳妥的做法是组合使用:
$this->output->set_content_type('application/json')->set_output(json_encode($data, JSON_UNESCAPED_UNICODE))
跨域场景下 CI3/CI4 的 JSON 响应要额外加什么
前端报错 No 'Access-Control-Allow-Origin' header,说明服务端没回 CORS 头。JSON 响应本身不解决跨域,得靠 header 补全。
- CI3:在输出前加
header('Access-Control-Allow-Origin: *')(生产环境别用 *,换成具体域名) - CI4:用
$this->response->setHeader('Access-Control-Allow-Origin', 'https://your-app.com') - 如果前端带 credentials(如 Cookie),还得加
Access-Control-Allow-Credentials: true,且 Origin 不能为 * - CORS 预检请求(OPTIONS)必须单独响应 200,否则 POST/PUT 的 JSON 请求发不出去
return,整个 JSON 就静默消失。









