Преобразование символов JSON в юникод

1

Я наткнулся на этот странный 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, будут приветствоваться.

Теги:
unicode
utf-8

1 ответ

2
Лучший ответ

Недействительна строка 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')).

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

  • 0
    JSON происходит от journald в формате json - journalctl -o json
  • 0
    Вы были правы, это был недействительный json из journald github.com/systemd/systemd/issues/1076
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню