来自post请求的(无效)json字符串中的奇怪字符(编码问题)

bvn4nwqk  于 5个月前  发布在  其他
关注(0)|答案(2)|浏览(70)

我正在尝试使用以下行从post请求中获取数据:

$data = file_get_contents('php://input');

字符串
json字符串可能是:{"test" : "test one \xe0 "}
问题是,当我试着做一个json_decode($data),我得到null,通过var_dump()$data,我看到一些像\xe0 \xe7a这样的字符。
发送的数据是utf-8格式的。我也使用utf8_decode($data),但运气不好。有人能解释一下我错过了什么或者如何解决这个问题吗?
我需要将无效的json转换为:

$data = '{"test" : "test one \xe0 "}';


收件人:

$data = '{"test" : "test one à "}';

icnyk63a

icnyk63a1#

修复JSON的一种方法是将无效的\xNN序列替换为有效的\u00NN序列:

$data = '{"test" : "test one \xe0 "}';
$val = json_decode(str_replace('\x', '\u00', $data));
echo $val->test;

字符串
输出量:

test one à

ubbxdtey

ubbxdtey2#

使用字符串函数对json字符串进行突变总是需要谨慎的,因为假阳性替换通常很容易损坏有效负载。也就是说,这里有一个脚本试图纠正无效的json字符串。
产品编号:(Demo

$json = '{"test" : "test one \xe0, \x270B"}';
    
$json = preg_replace_callback(
           '/\\\\x([[:xdigit:]]+)/',
           fn($m) => sprintf('\u%04s', $m[1]),
           $json
     );
     
echo "\n" . var_export(json_validate($json), true);
echo "\n$json\n";
var_export(json_decode($json));

字符串
输出量:

true
{"test" : "test one \u00e0, \u270B"}
(object) array(
   'test' => 'test one à, ✋',
)


如果这有已知的缺陷,请在下面留下评论,我会奋进克服这个问题,当我有时间。
相关答案:Replace all hex sequences with ascii characters

相关问题