PHP实现json_encode函数不转义中文的多种方法

AndyYang| 阅读:155 发表时间:2017-07-15 16:58:49 php
摘要:如果你调用 PHP 自带的 json_encode() 函数, 碰到中文时, 中文会被转义掉。可是有些时候,希望中文不被转义,那怎么实现呢?
如果你调用 PHP 自带的 json_encode() 函数, 碰到中文时, 中文会被转义掉。

$arr = array(
    'name' => 'webyang.net IT技术博客',
    'url'  => 'www.webyang.net',
);
运行echo json_encode($arr);结果输出:{"name":"webyang.net IT\u6280\u672f\u535a\u5ba2","url":"www.webyang.net"}

如何禁用掉这种转义呢?

PHP5.4+版本(多加 JSON_UNESCAPED_UNICODE 参数即可):
json_encode($json, JSON_UNESCAPED_UNICODE);
同样上面的数组,结果输出:{"name":"webyang.net IT技术博客","url":"www.webyang.net"}

PHP5.3版本及以下:
方法一:
$arr['name'] = urlencode($arr['name']);
echo urldecode(json_encode($arr));
同样上面的数组,结果输出:{"name":"webyang.net IT技术博客","url":"www.webyang.net"}
但这种做法,如果中文key值很多的时候,写起来会代码比较臃肿。

方法二:
function my_json_encode($arr)
{
    //convmap since 0x80 char codes so it takes all multibyte codes (above ASCII 127). So such characters are being "hidden" from normal json_encoding
    array_walk_recursive($arr, function (&$item, $key) { if (is_string($item)) $item = mb_encode_numericentity($item, array (0x80, 0xffff, 0, 0xffff), 'UTF-8'); });
    return mb_decode_numericentity(json_encode($arr), array (0x80, 0xffff, 0, 0xffff), 'UTF-8');
}
调用echo my_json_encode($arr); 结果输出:{"name":"webyang.net IT技术博客","url":"www.webyang.net"}。

方法三:
function json_encode_new($input) {
    // 从 PHP 5.4.0 起, 增加了这个选项.
    if(defined('JSON_UNESCAPED_UNICODE')) {
        return json_encode($input, JSON_UNESCAPED_UNICODE);
    }

    if(is_string($input)) {
        $text = $input;
        $text = str_replace('\\', '\\\\', $text);
        $text = str_replace(
            array("\r", "\n", "\t", "\""),
            array('\r', '\n', '\t', '\\"'),
            $text);
        return '"' . $text . '"';
    } else if(is_array($input) || is_object($input)) {
        $arr = array();
        $is_obj = is_object($input) || (array_keys($input) !== range(0, count($input) - 1));
        foreach($input as $k=>$v) {
            if($is_obj) {
                $arr[] = json_encode_new($k) . ':' . json_encode_new($v);
            } else {
                $arr[] = json_encode_new($v);
            }
        }
        if($is_obj) {
            return '{' . join(',', $arr) . '}';
        } else {
            return '[' . join(',', $arr) . ']';
        }
    } else {
        return $input . '';
    }
}
调用echo json_encode_new($arr); 结果输出:{"name":"webyang.net IT技术博客","url":"www.webyang.net"}。
网上大部分都是这种做法,而且一搜一大把。想起农夫山泉的广告:我们不生产水,我们只是大自然的搬运工。

不过这年头,基本都是php5.4以上。

本文为AndyYang原创,转载请注明出处!
如果您觉得好,可以打赏作者:

已有1条评论

昵称:
邮箱:

  • 最新评论

tt2017-08-04 08:46:37
人丑就得多读书~
若兰网 - www.rolan.wang
反馈
微信订阅号