前些天弄微信公众号自定义菜单的时候,看的它的文档中json数据中文都没有转义过,当时用了一个最笨的方法,就是按它那种格式手动写出来,然后在接口调试那里直接生成了自定义菜单。今天偶然发现了一种PHP数组转json而不转义中文和 / \ 的方法,记录下来:
/**
* 不转义中文字符和\/的 json 编码方法
* @param array $arr 待编码数组
* @return string
*/
function json_encode_no_zh($arr) {
$str = str_replace ( "\\/", "/", json_encode ( $arr ) );
$search = "#\\\u([0-9a-f]+)#ie";
if (strpos ( strtoupper(PHP_OS), 'WIN' ) === false) {
$replace = "iconv('UCS-2BE', 'UTF-8', pack('H4', '\\1'))";//LINUX
} else {
$replace = "iconv('UCS-2', 'UTF-8', pack('H4', '\\1'))";//WINDOWS
}
return preg_replace ( $search, $replace, $str );
}由于 PHP 5.5 之后弃用了 e ,会报错:
Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead
所有如果使用更高版本 PHP 的可以使用 preg_replace_callback 函数,参考下面的方法:
function json_encode_no_zh($arr) {
$str = str_replace ( "\\/", "/", json_encode ( $arr ) );
$search = "#\\\\u([0-9a-f]{4})#i";
return preg_replace_callback($search, create_function('$matches', 'if (strpos(strtoupper(PHP_OS), "WIN") === false) return iconv("UCS-2BE", "UTF-8", pack("H4", $matches[1])); else return iconv("UCS-2", "UTF-8", pack("H4", $matches[1]));'), $str);
}
相随 2015/12/07 12:19
不错,感谢楼主。简洁。
陌熙 2016/08/16 18:15
如果中文中含有数字,则该方法把所有数字都去掉了
Specs 2016/08/16 23:30
@ 不会啊