本文编写于 275 天前,最后修改于 275 天前,其中某些信息可能已经过时。

PHP json_encode无输出问题以及处理调试方案

问题复现

今天改php老代码,把html和php混合的输出改成json输出方便渲染,于是正常使用了while语句

//直接输出json
$r = [];
$r['id'] = 0;
while($m = $db->fetch($sql)){
    $r['id'] = $r['id']+1;
    $r['src'] = "/m/show.php?id=".$m['id']."&kc=".$kecheng;
    $r['title'] = $m['title'];
    $res[] = $r;
}

//print_r($res);
echo json_encode($res) ;

结果发现一直输出空白,但如果使用print_r()就又有输出,怀疑是json_encode()函数有问题

问题思路

  1. 首先尝试了直接输出$res 发现没问题,显示Array说明有数值
  2. 然后直接echo json_encode(某数组),发现也没有输出,那必定是这个函数的问题
  3. 查找php版本,发现是5.6,查了手册发现只要是5.2以上版本都支持,那为什么还又问题呢?

解决思路

首先查网上资料,发现json_encode()函数也有调试模式json_last_error(),只要在输出后加上var_dump(json_last_error());就能知道函数哪里出问题了

echo json_encode(array('error' => '0', 'message' => '没有错误'));
var_dump(json_last_error());
//这里也可以是json_decode

//错误码对照
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

最后我出现的是int(5)说明是JSON_ERROR_UTF8错误,说明是编码错误,回头想想,确实是编码问题,因为是老项目,整个编码都是GB2312不是UTF8,导致无法encode,上图可以看得出来

那么就要把gb2312编码部分的中文转换成UTF8输出

那么用iconv('gbk', 'utf-8', $data)函数就解决了

解决问题

//直接输出json
$r = [];
$r['id'] = 0;
while($m = $empire->fetch($sql)){
    $r['id'] = $r['id'] + 1;
    $r['src'] = "/m/show.php?id=".$m['id']."&kc=".$kecheng;
    $r['title'] = iconv('gbk', 'utf-8', $m['title']);//中文部分转换后再输出
    $res[] = $r;
}

//print_r($res);
echo json_encode($res) ;

最后输出成功

参考资料

  1. php 解决json gbk编码中文null问题
  2. php json_encode输出空白问题