PHP json_encode返回JSON_ERROR_UTF8

一、问题描述
阅读一个新系统代码,调试打印方法返回结果,是一个数组,用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;
}

参考:
json-如何解决php json_decode中的JSON_ERROR_UTF8错误?

发表评论

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