转 Json移除非法 Utf8字符串

  • 当 json_decode 解析为 null 的时候怎么处理
  • 当 json 中出现非法 utf8 时怎么处理

失败时返回NULL

当返回 null 的时候,可以用json_last_error()根据返回码来判断

如果 php 版本过低的话将会出现错误码反馈不全的问题,返回值是JSON_ERROR_NONE (0)
这是示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 //  $json = '{"a":1,"b":2,"c":3,"d":4,"e":5, "name":"Corwien"}';
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5, "name":}'; //错误的json格式
$result = json_decode($json, true);
if(!$result)
{
//error handle ,错误处理
$ret = json_last_error();
print_r($ret); //打印为: 4,查错误信息表,可知是语法错误

}

json_last_error错误msg对照表:
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

如何处理json中的非法utf8字符

如果出现 JSON_ERROR_SYNTAX 这个错误码的时候,常见的要么是其中的双引号单引号问题,要么是
出现了 /r/n之类的结尾问题,还有一种比较烦的情况就是错误的 utf8编码

解决问题:

1
2
3
4
5
6
7
8
9
10
11
//reject overly long 2 byte sequences, as well as characters above U+10000 and replace with ?
$some_string = preg_replace('/[\x00-\x08\x10\x0B\x0C\x0E-\x19\x7F]'.
'|[\x00-\x7F][\x80-\xBF]+'.
'|([\xC0\xC1]|[\xF0-\xFF])[\x80-\xBF]*'.
'|[\xC2-\xDF]((?![\x80-\xBF])|[\x80-\xBF]{2,})'.
'|[\xE0-\xEF](([\x80-\xBF](?![\x80-\xBF]))|(?![\x80-\xBF]{2})|[\x80-\xBF]{3,})/S',
'?', $some_string );

//reject overly long 3 byte sequences and UTF-16 surrogates and replace with ?
$some_string = preg_replace('/\xE0[\x80-\x9F][\x80-\xBF]'.
'|\xED[\xA0-\xBF][\x80-\xBF]/S','?', $some_string );

原文
utf8代码

这个博客有个赞赏功能,不试一下吗?