avatar

tetsai

原创声明

本文由tetsai原创,转载请注明来源

在做PHP**时发现,明明print_r指令可以正常输出array,但是json_encode却为空

执行json_last_error_msg() 发现返回为5

JSON_ERROR_NONE没有错误发生 
JSON_ERROR_DEPTH到达了最大堆栈深度 
JSON_ERROR_STATE_MISMATCH无效或异常的 JSON 
JSON_ERROR_CTRL_CHAR控制字符错误,可能是编码不对 
JSON_ERROR_SYNTAX语法错误 
JSON_ERROR_UTF8异常的 UTF-8 字符,也许是因为不正确的编码。PHP 5.3.3
JSON_ERROR_RECURSIONOne or more recursive references in the value to be encodedPHP 5.5.0
JSON_ERROR_INF_OR_NANOne or more NAN or INF values in the value to be encodedPHP 5.5.0
JSON_ERROR_UNSUPPORTED_TYPE指定的类型,值无法编码。PHP 5.5.0
JSON_ERROR_INVALID_PROPERTY_NAME指定的属性名无法编码。PHP 7.0.0
JSON_ERROR_UTF16畸形的 UTF-16 字符,可能因为字符编码不正确。PHP 7.0.0

根据下表:

  • 0 JSON_ERROR_NONE
  • 1 JSON_ERROR_DEPTH
  • 2 JSON_ERROR_STATE_MISMATCH
  • 3 JSON_ERROR_CTRL_CHAR
  • 4 JSON_ERROR_SYNTAX
  • 5 JSON_ERROR_UTF8
  • 6 JSON_ERROR_RECURSION
  • 7 JSON_ERROR_INF_OR_NAN
  • 8 JSON_ERROR_UNSUPPORTED_TYPE

可以得出,是JSON_ERROR_UTF8错误,也就是UTF-8编码错误

初步判定,json里含有非法的utf-8字符,所以不能json_encode

使用下面的函数对数组进行格式转化,变成utf-8格式就可以正常json_encode了。

    public function ar_utf8(&$ar){
        array_walk($ar, function(&$s) {
            if(is_numeric($s)) {
                $s= intval($s);
            } else {
                $s= iconv("GBK","UTF-8",$s);
            }
        });
    }
    json_encode(ar_utf8($array));

发表评论

电子邮件地址不会被公开。 必填项已用*标注