PHP JSON_ERROR_UTF16错误

描述

最近再处理抓取结果时,json_decode返回NULL,调用json_last_error返回10(JSON_ERROR_UTF16),json_last_error_msg()返回“Single unpaired UTF-16 surrogate in unicode escape”,意思是指解析器发现不可解析的UTF-16编码。

诊断

查询PHP文档后发现JSON_ERROR_UTF16是PHP 7.0新增加的错误代码。下面是测试代码:

    $s = '{"x":"abcde\uDFFF"}';
    $j = json_decode($s, true);
    var_dump($j);
    echo json_last_error() . "\n";
    echo json_last_error_msg() . "\n";

在php 5.5.9下输出为:

array(1) {
  ["x"]=>
  string(8) "abcde�"
}
0
No error

可以看到在5.5.9下虽然有不可识别的字符,但是并没有报错,看来是php 7.0检查得更严格了。 在php 7.0.28下输出为:

NULL
10
Single unpaired UTF-16 surrogate in unicode escape

该错误目前没有发现特别好的办法,一个可行的办法是把字符串中Unicode转义符\u替换为普通字符,然后调用json_decode,解析成功后再对替换过的字符串特别处理。