PHP json_encode 返回空文本 (json_last_error_msg()为5-UTF8错误)

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_RECURSION | One or more recursive references in the value to be encoded | PHP 5.5.0 |
JSON_ERROR_INF_OR_NAN | One or more NAN or INF values in the value to be encoded | PHP 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));