模拟json_decode解析非法utf-8编码字符串

index.php
$str = include("data.php"); //放一个gbk编码的文件,返回json字符串


// 替换非法utf8字符串为“?”
$str = preg_replace('/[x00-x08x10x0Bx0Cx0E-x19x7F]'.
 '|[x00-x7F][x80-xBF]+'.
 '|([xC0xC1]|[xF0-xFF])[x80-xBF]*'.
 '|[xC2-xDF]((?![x80-xBF])|[x80-xBF]{2,})'.
 '|[xE0-xEF](([x80-xBF](?![x80-xBF]))|(?![x80-xBF]{2})|[x80-xBF]{3,})/S',
 '?', $str );
$str = preg_replace('/xE0[x80-x9F][x80-xBF]'.
 '|xED[xA0-xBF][x80-xBF]/S','?', $str );


// 解析
$arr = json_decode($str,true);
echo "<pre>";
if(!$arr){
    print_r(json_last_error()); //错误码
}else{
    print_r($arr);
}
错误码对照表
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
data.php 设置为gbk编码
<?php

return '{"messageType" : "Test萨达", "from" : "F2D0B5C6-9875-46B5-8D4F"}';

今天进步一点点,明天梦想近点点!

原文地址:https://www.cnblogs.com/qq917937712/p/15464533.html