前些天弄微信公众号自定义菜单的时候,看的它的文档中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
@ 不会啊