2024年1月

在php中可以使用 json_encode() 方法快速将数组转化成json字符串.

偶然在一个aes加密方法后,发现与预期不符。经过排查发现 json_encode() 方法将中文进行了 Unicode 转化。

预期的 {"name":"张三"} 变成了 {"name":"\u5f20\u4e09"} ,结果导致了加密方法后不一致的问题。

经过查看手册发现,json_encode() 函数提供了可选的参数。其中,JSON_UNESCAPED_UNICODE 用于确保中文字符不被转义为 Unicode 编码。

<?php

echo json_encode(['name' => '张三'], JSON_UNESCAPED_UNICODE);

经过添加一个参数控制了中文Unicode转化的问题,但是在实际项目中经过加密方法后仍然导致不一样,经排查,数组中包含了url地址,json_encode() 会将 / 转义为 \/

{"name":"张三","url":"http://baidu.com"} 变成了 {"name":"张三","url":"http:\/\/baidu.com"}

行,我继续翻手册,找到 JSON_UNESCAPED_SLASHES 这个参数可以不转义斜杠。在我们既不想中文转化,也不想转义斜杠的情况下,可以使用 加法 将2个常量相加。

<?php

echo json_encode(['name' => '张三', 'url':'http://baidu.com'], JSON_UNESCAPED_UNICODE + JSON_UNESCAPED_SLASHES);

至此,问题圆满解决。