最後把飯盆舔的賊乾淨 
是 GBk 编码的,不能被 json_encode 函数所接受(其实转成 utf-8 编码的就可以了)
你就用自己的函数进行处理?
但是为什么要做转义处理呢?不理解至于 賊 变成了 賊\ 原因很简单
賊 的内码是 d95c
\    的内码是 5c
你做了转义处理,自然转义符就变成 \\ 了
前一个 \ 和 賊 的第一字节结合成 賊,于是就成了现在这个样子了

解决方案 »

  1.   

    楼上的好猛,直接都能猜到我是如何写的佩服啊转义只是为了 避免数据里面可能会出现 \ \r \n 各种之类 不符合JSON的。替换掉。因为是GBK的所有找了个自定义的JSON函数。但是居然 碰到了个 賊。大神的意思。我应该对 \\ 也做一次转义吗?
    function encode($arg, $force = true)
        {
            static $_force;
            if (is_null($_force))
            {
                $_force = $force;
            }        if ($_force && EC_CHARSET == 'utf-8' && function_exists('json_encode'))
            {
                return json_encode($arg);
            }        $returnValue = '';
            $c           = '';
            $i           = '';
            $l           = '';
            $s           = '';
            $v           = '';
            $numeric     = true;        switch (gettype($arg))
            {
                case 'array':
                    foreach ($arg AS $i => $v)
                    {
                        if (!is_numeric($i))
                        {
                            $numeric = false;
                            break;
                        }
                    }                if ($numeric)
                    {
                        foreach ($arg AS $i => $v)
                        {
                            if (strlen($s) > 0)
                            {
                                $s .= ',';
                            }
                            $s .= $this->encode($arg[$i]);
                        }                    $returnValue = '[' . $s . ']';
                    }
                    else
                    {
                        foreach ($arg AS $i => $v)
                        {
                            if (strlen($s) > 0)
                            {
                                $s .= ',';
                            }
                            $s .= $this->encode($i) . ':' . $this->encode($arg[$i]);
                        }                    $returnValue = '{' . $s . '}';
                    }
                    break;            case 'object':
                    foreach (get_object_vars($arg) AS $i => $v)
                    {
                        $v = $this->encode($v);                    if (strlen($s) > 0)
                        {
                            $s .= ',';
                        }
                        $s .= $this->encode($i) . ':' . $v;
                    }                $returnValue = '{' . $s . '}';
                    break;            case 'integer':
                case 'double':
                    $returnValue = is_numeric($arg) ? (string) $arg : 'null';
                    break;            case 'string':
                    $returnValue = '"' . strtr($arg, array(
                        "\r"   => '\\r',    "\n"   => '\\n',    "\t"   => '\\t',     "\b"   => '\\b',
                        "\f"   => '\\f',    '\\'    => '',     '"'    => '\"',
                        "\x00" => '\u0000', "\x01" => '\u0001', "\x02" => '\u0002', "\x03" => '\u0003',
                        "\x04" => '\u0004', "\x05" => '\u0005', "\x06" => '\u0006', "\x07" => '\u0007',
                        "\x08" => '\b',     "\x0b" => '\u000b', "\x0c" => '\f',     "\x0e" => '\u000e',
                        "\x0f" => '\u000f', "\x10" => '\u0010', "\x11" => '\u0011', "\x12" => '\u0012',
                        "\x13" => '\u0013', "\x14" => '\u0014', "\x15" => '\u0015', "\x16" => '\u0016',
                        "\x17" => '\u0017', "\x18" => '\u0018', "\x19" => '\u0019', "\x1a" => '\u001a',
                        "\x1b" => '\u001b', "\x1c" => '\u001c', "\x1d" => '\u001d', "\x1e" => '\u001e',
                        "\x1f" => '\u001f'
                    )) . '"';
                    break;            case 'boolean':
                    $returnValue = $arg?'true':'false';
                    break;            default:
                    $returnValue = 'null';
            }        return $returnValue;
        }
      

  2.   

    '\\'    => '',
    这个位置的代码 以前是
    '\\'    => '\\\\',但是賊会导致错误。所以我直接改成空了
      

  3.   

    求大神赐教。如何避免将GBK转JSON。又能避免这些事情
      

  4.   

    可以先将GBK转UTF8$str='最後把飯盆舔的賊乾淨'; 
    $str=iconv("GBK", "UTF-8", $str); 
      

  5.   

    数据库是 gbk 的没关系,你可以按 utf-8 读出,这样就可以用 json 函数了
    你也可以读出来转码,嫌麻烦的话。给你一个类class GBK {
      public static function unserialize($s) {
    $s = preg_replace_callback('/s:\d+:"([^"]+)";/',
    function($r) {
    $n = strlen($r[1]);
    return "s:$n:\"$r[1]\";";
    },
    $s
    );
    return unserialize($s);
      }  public static function json_encode($s, $charset='gbk') {
    if($charset == 'utf-8') return json_encode($s);
    $s = serialize($s);
    $s = gbk::unserialize(iconv($charset, 'utf-8', $s));
    return preg_replace_callback('/[\\\]u(\w{4})/',
    function($r) use ($charset) {
    return iconv('ucs-2', $charset, pack('H4', $r[1]));
    },
    json_encode($s)
    );
      }  public static function json_decode($s, $assoc=0, $charset='gbk') {
    if(json_encode(json_decode($s)) != $s) $s = iconv('gbk', 'utf-8', $s);
    $t = json_decode($s, $assoc);
    if($charset == 'uft-8') return $t;
    return gbk::unserialize(iconv('utf-8', $charset, serialize($t)));
      }  public static function preg_replace($pattern, $replacement, $subject, $limit=-1) {
    $pattern = iconv('gbk', 'utf-8', $pattern);
    $replacement = iconv('gbk', 'utf-8', $replacement);
    $subject = iconv('gbk', 'utf-8', $subject);
    $t = preg_replace($pattern, $replacement, $subject, $limit=-1);
    return iconv('utf-8', 'gbk', $t);
      }
      public static function preg_match($pattern, $subject, &$matches=array(), $flags=0) {
    self::toutf8($pattern);
    self::toutf8($subject);
    $n = preg_match($pattern, $subject, $matches, $flags);
    if($matches) self::togbk($matches);
    return $n;
      }
      static function toutf8(&$str) {
    if(is_array($str)) foreach($str as &$s) return self::toutf8($s);
    $str = iconv('gbk', 'utf-8', $str);
      }
      static function togbk(&$str) {
    if(is_array($str)) foreach($str as &$s) return self::togbk($s);
    $str = iconv('utf-8', 'gbk', $str);
      }
    }
      

  6.   

    xuzuning 
    简直 无法形容对你的感谢了。 强悍 热心 迅速我引用了你的类。问题已经解决。
    之前用的自定义类。还出现了个问题。“還有許多水上運動的俱樂部” 这句话 直接导致了乱码
      

  7.   

    用了 大神的类。再次出现问题一下是段内容玩了一会,小熊说"你想爸爸和妈妈吗“,我说“想,爸爸妈妈説休息天还要带我出去玩呢”,“你多好呀,我连自己的爸妈是谁再哪都不知道",说完小熊就呜呜的哭了起来,我见状一下抱住了小熊,劝他不要哭了,“以后我天天陪伴着你和你玩”。
    这里的引号会导致 解析过不去 成了false
      

  8.   

    是的,特殊情况下确实有问题
    我那个写法的本意是能处理这样的数组:
    array( '中文' => '很多很多内容')
    echo gbk::json_encode(array( '中文' => '很多很多内容'));{"中文":"很多很多内容"}
      

  9.   

    你的这个写法 能处理繁体也很好。但是特殊字符 没办法处理。而且 我把"替换成 \"。
    然后再用你的方法。还是false,但实质符合JSON格式了
      

  10.   

    PHP文档BOM头记事本新建<?php
    header("Content-Type: text/html; charset=utf-8");
    echo gbk::json_encode(array( '中文' => '玩了一会,小熊说"你想爸爸和妈妈吗“,我说“想,爸爸妈妈説休息天还要带我出去玩呢”,“你多好呀,我连自己的爸妈是谁再哪都不知道",说完小熊就呜呜的哭了起来,我见状一下抱住了小熊,劝他不要哭了,“以后我天天陪伴着你和你玩”。'));
    ?>编码选保存utf-8,然后运行,还报错?
      

  11.   

    echo gbk::json_encode(array( '中文' => '很多很多内容'));如果把内容处理成 这样子的单引号的呀。gbk::json_encode(从数据库里获取的对象)
      

  12.   

    钻研的劲头真不小啊!把 
      public static function unserialize($s) {
    $s = preg_replace_callback('/s:\d+:"([^"]+)";/',
    改成
      public static function unserialize($s) {
    $s = preg_replace_callback('/s:\d+:"(.+?)";/',就可以了
      

  13.   


    【配文】+圈儿当上了治安协管员[i=s] 本帖最后由 我爱小丫 于 2014-5-6 02:59 编辑 [/i][attach]4590100[/attach]
    画外音:圈儿自从上次举报了打陀螺的成名之后,就被当地的市民一致推举为“优秀荣誉市民”。很快又被当地的派出所聘为“治安协管员”。这不,新的一天,圈儿又开始了每天例行的巡逻了。改了后。文本是这个。还是false
      

  14.   

    呵呵,忘了还可能有换行
    $s = preg_replace_callback('/s:\d+:"(.+?)";/s',