laravel unicode编码问题

本文探讨了laravel框架在返回json时,默认将中文编码为unicode的问题,包括原因和三种解决方案:自定义json输出方法、修改laravel源码以及处理已存储的unicode编码数据。
摘要由CSDN通过智能技术生成

lavavel 框架默认返回json的方法,中文都进行了unicode编码(转json中文被转义问题)

原因

例如:
1、当我们把数组转成json数据时,laravel 默认将中文进行Unicode编码;
2、我们写接口返回json结果时,laravel 默认将中文进行Unicode编码;

举个例子:
使用 json_encode 方法输出
模拟laravel 中使用json_encode
使用 response() -> json() 方法输出
使用 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) 进行还原为数组
例:
json_decode

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值