lavavel 框架默认返回json的方法,中文都进行了unicode编码(转json中文被转义问题)
原因
例如:
1、当我们把数组转成json数据时,laravel 默认将中文进行Unicode编码;
2、我们写接口返回json结果时,laravel 默认将中文进行Unicode编码;
举个例子:
使用 json_encode 方法输出
使用 response() -> json() 方法输出
例中的中文字符被转义为 unicode 编码
一般情况下,我们不处理,就让它转为 unicode 编码,也不会有什么影响,因为可以交给前端处理;而大多数情况下,前端也不需要处理,如ajax异步请求时,会将 unicode 编码自动解码为中文;
但为了友好的前后端交互,还是处理一下会更佳
解决方案:
以下列举三种解决方案
1、输出json格式数据时,避免直接使用 json_encode 、response()->json($data) 等方法;直接构建一个方法,用来输出json格式数据
/**
* @param string|array $data 需要转换为json格式的数据
* @return \Illuminate\Http\JsonResponse|\Symfony\Component\HttpFoundation\JsonResponse
*/
public static function ToJson($data) {
return response()->json($data)->setEncodingOptions(JSON_UNESCAPED_UNICODE);
}
2、 直接修改 laravel 源码 , 用于修改 response() -> json() 输出 json 数据,对于 json_encode 等无效;
源码位置:/vendor/laravel/framework/src/Illuminate/Http/JsonResponse.php
在 魔术方法 __construct 中,修改 $this->encodingOptions = JSON_UNESCAPED_UNICODE;
/**
* Constructor.
*
* @param mixed $data
* @param int $status
* @param array $headers
* @param int $options
* @return void
*/
public function __construct($data = null, $status = 200, $headers = [], $options = 0)
{
// $this->encodingOptions = $options;
$this->encodingOptions = JSON_UNESCAPED_UNICODE;
parent::__construct($data, $status, $headers);
}
3、 已经被转义为 unicode 编码,且已存储在了数据库中,我们需要把还原为中文时,我们可以构建一个专门解码unicode 编码的方法
ps: 数组无法直接使用
/**
* unicode 解码
* @param string $str unicode 编码的字符串
* @return string|string[]|null
*/
public static function unicodeDecode($str) {
return preg_replace_callback('/\\\\u([0-9a-f]{4})/i', function ($match) {
return mb_convert_encoding(pack('H*', $match[1]), 'UTF-8', 'UCS-2BE');
}, $str);
}
若为数组可以直接使用 json_decode($json,true) 进行还原为数组
例: