一、问题描述
阅读一个新系统代码,调试打印方法返回结果,是一个数组,用json_encode编码后,写到日志文件中,写入的是空字符串,打印数组的长度是6
也是活久见,用PHP这么多年,第一次遇到这类问题
二、问题分析
1、输出json_encode返回的错误信息
$str = json_encode($arr); $res = json_last_error() var_dump($res); // 5
返回5为UTF-8编码问题,参考手册
5 = JSON_ERROR_UTF8
2、用var_export()打印数组内容
file_put_contents('salmonl.log', var_export($arr, true));
发现很多奇怪的字符
三、问题解决
1、使用优化后的编码方法
function safe_json_encode($value, $options = 0, $depth = 512, $utfErrorFlag = false) { $encoded = json_encode($value, $options, $depth); switch (json_last_error()) { case JSON_ERROR_NONE: return $encoded; case JSON_ERROR_DEPTH: return 'Maximum stack depth exceeded'; // or trigger_error() or throw new Exception() case JSON_ERROR_STATE_MISMATCH: return 'Underflow or the modes mismatch'; // or trigger_error() or throw new Exception() case JSON_ERROR_CTRL_CHAR: return 'Unexpected control character found'; case JSON_ERROR_SYNTAX: return 'Syntax error, malformed JSON'; // or trigger_error() or throw new Exception() case JSON_ERROR_UTF8: $clean = utf8ize($value); if ($utfErrorFlag) { return 'UTF8 encoding error'; // or trigger_error() or throw new Exception() } return safe_json_encode($clean, $options, $depth, true); default: return 'Unknown error'; // or trigger_error() or throw new Exception() } } function utf8ize($mixed) { if (is_array($mixed)) { foreach ($mixed as $key => $value) { $mixed[$key] = utf8ize($value); } } else if (is_string ($mixed)) { return utf8_encode($mixed); } return $mixed; }