2015-08-29 5 views
1

Я столкнулся с этим странным JSON, который я не могу расшифровать. Чтобы упростить вещи, скажем, это строка 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 строка будет приветствоваться.

ответ

2

Недействительна строка JSON - JSON поддерживает только 4 шестнадцатеричных разряда после \ u. Результаты как PHP, так и JS верны.

Невозможно декодировать это, используя стандартные функции.

Откуда у вас эта строка JSON?

О правильном формате JSON для строки, которую вы хотите получить - это должно быть "\u2514\u2500\u2500 mystring", или просто "└── mystring" (JSON поддерживает любые символы Юникода в строках, кроме " и \).

Также, если вам нужно закодировать символ, который требует более двух байтов - это приведет к двум escape-кодам, например "" будет "\ud864\udd0e" при экранировании.

Итак, если вам действительно нужно декодировать строку выше - вы можете это исправить перед декодированием, заменив \uffffffe2 на \uffff\uffe2 с помощью регулярных выражений (для JS это будет что-то вроде: s.replace(/(\\u[A-Fa-f0-9]{4})([A-Fa-f0-9]{4})/gi,'$1\\u$2')).

Но в любом случае коды символов в строке, указанной выше, выглядят неправильно.

+0

JSON поступает из 'journald' в формате json -' journalctl -o json' –

+0

Вы были правы, это было неверно json из 'journald' https://github.com/systemd/systemd/issues/1076 –

+0

управляющие символы U + 0000 до U + 001F _must_ также будут экранированы; не только "и \ См. [Стандарт JSON] (http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf) или [RFC 8259] (https: // tools. ietf.org/html/rfc8259). – Gerhard

Смежные вопросы