Я наткнулся на этот странный JSON, который я не могу расшифровать. Чтобы упростить, скажем, это строка JSON:
"\uffffffe2\uffffff94\uffffff94\uffffffe2\uffffff94\uffffff80\uffffffe2\uffffff94\uffffff80 mystring"
После декодирования он должен выглядеть следующим образом:
└── mystring
JS или PHP, похоже, не преобразуют его правильно.
js> JSON.parse('"\uffffffe2\uffffff94\uffffff94\uffffffe2\uffffff94\uffffff80\uffffffe2\uffffff94\uffffff80 mystring"')
ffe2ff94ff94ffe2ff94ff80ffe2ff94ff80 mystring
PHP ведет себя одинаково
php> json_decode('"\uffffffe2\uffffff94\uffffff94\uffffffe2\uffffff94\uffffff80\uffffffe2\uffffff94\uffffff80 mystring"')
ffe2ff94ff94ffe2ff94ff80ffe2ff94ff80 mystring
Любые идеи о том, как правильно разобрать эту строку JSON, будут приветствоваться.
Недействительна строка JSON - JSON поддерживает только 4 шестнадцатеричных цифры после \u. Результаты как PHP, так и JS верны.
Невозможно декодировать это, используя стандартные функции.
Где вы взяли эту строку JSON?
О правильном json для строки, которую вы хотите получить, - это должно быть "\u2514\u2500\u2500 mystring"
или просто "└── mystring"
(json поддерживает любые символы юникода в строках, кроме "
и \
).
Также, если вам нужно закодировать некоторый символ, для которого требуется более двух байтов, это приведет к двум escape-кодам, например, "?"
будет "\ud864\udd0e"
при экранировании.
Итак, если вам действительно нужно декодировать строку выше - вы можете исправить ее перед декодированием, заменив \uffffffe2
на \uffff\uffe2
помощью regexp (для js это будет что-то вроде: s.replace(/(\\u[A-Fa-f0-9]{4})([A-Fa-f0-9]{4})/gi,'$1\\u$2')
).
Но в любом случае коды символов в строке, указанной выше, выглядят неправильно.
journald
в формате json -journalctl -o json
journald
github.com/systemd/systemd/issues/1076