Узел 12 теперь использует Правильно сформированный JSON.stringify , который выводит escape-последовательности для одиноких суррогатов. PHP не может json_decode это, когда есть одинокий суррогат, который экранирован.
Возьмите следующий пример кода в узле.
var a = '???????? ??? ???????????';
JSON.stringify(a.slice(0, 15));
// Node 10 output:
'"???????�"';
// Node 12 output:
'"???????\\ud835"'
Этот ответ затем отправляется на сервер PHP в формате JSON и декодируется. Вот где происходит ошибка. Вывод Node10 раньше работал нормально с PHP json_decode, но он больше не работает с выводом Node12.
Я упростил пример NODE-> PHP, см. Ниже.
<?php
$string = '{"string": "???????\\ud835"}';
var_dump(json_decode($string, false, 512, JSON_THROW_ON_ERROR | JSON_INVALID_UTF8_IGNORE | JSON_INVALID_UTF8_SUBSTITUTE));
// Output:
Fatal error: Uncaught JsonException: Single unpaired UTF-16 surrogate in unicode escape in phptest.php:36
Stack trace:
#0 phptest.php(36): json_decode('{"string": "\xF0\x9D\x98...', false, 512, 7340032)
#1 {main}
thrown in phptest.php on line 36
Я ожидаю следующие опции JSON_INVALID_UTF8_IGNORE
или JSON_INVALID_UTF8_SUBSTITUTE
для работы с json_decode в PHP 7.3+, но это совсем не помогает. JSON_THROW_ON_ERROR
на самом деле выдает ошибку, чтобы упростить отладку.