yii2关闭json中文转义需配置response组件的jsonresponseformatter编码选项为json_unescaped_unicode | json_unescaped_slashes,全局在config/web.php中设置,局部在控制器beforeaction中设置,并统一使用asjson()或自动触发json格式返回。

Yii2 默认使用 json_encode() 返回验证错误信息,中文会被转义为 Unicode(如 \u4f60\u597d),影响前端可读性。关闭 JSON 中文转义的关键是配置响应的 JSON 编码选项,而非修改验证逻辑本身。
设置 Response 的 JSON 编码选项
在控制器或应用配置中,为 response 组件启用 JSON_UNESCAPED_UNICODE 选项:
- 全局生效(推荐):在
config/web.php中添加:
'response' => [
'class' => 'yii\web\Response',
'on beforeSend' => function ($event) {
$response = $event->sender;
if ($response->format === \yii\web\Response::FORMAT_JSON) {
$response->headers->add('Content-Type', 'application/json; charset=UTF-8');
}
},
],
'components' => [
'response' => [
'formatters' => [
'json' => [
'class' => 'yii\web\JsonResponseFormatter',
'encodeOptions' => JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES,
],
],
],
],
- 局部生效(如仅 API 控制器):在控制器的
beforeAction()中设置:
public function beforeAction($action)
{
\Yii::$app->response->formatters['json'] = [
'class' => 'yii\web\JsonResponseFormatter',
'encodeOptions' => JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES,
];
return parent::beforeAction($action);
}
确保验证错误消息本身是中文
转义与否只影响输出编码,不改变语言内容。确认模型规则中使用的是中文提示:
public function rules()
{
return [
[['username'], 'required', 'message' => '用户名不能为空'],
[['email'], 'email', 'message' => '邮箱格式不正确'],
];
}
若用 Yii::t() 翻译,请确保对应语言文件已加载且返回中文字符串。
避免手动 json_encode() 覆盖配置
如果在控制器中手动调用 json_encode() 返回数据(例如 return json_encode([...])),会绕过 Yii 的响应格式器,导致配置失效。应统一使用:
return $this->asJson(['error' => $model->getErrors()]);- 或直接
return ['error' => $model->getErrors()];(配合Response::FORMAT_JSON自动触发)
检查 PHP 版本与扩展
JSON_UNESCAPED_UNICODE 自 PHP 5.4 起可用,确保环境满足。若仍出现转义,可临时检测:
var_dump(json_encode(['msg' => '测试'], JSON_UNESCAPED_UNICODE));
输出应为 {"msg":"测试"},否则需排查 PHP 配置或 mbstring 扩展是否异常。











