Преобразование \ u003c в <символ с помощью инструментов Linux - PullRequest
0 голосов
/ 01 июня 2019

От вызова ajax я получил что-то вроде этого:

{"d":"\u003cdiv class=\"popup_title\"\u003eBENTELER Autótechnika Kft.\u003c/div\u003e\u003cdiv style=\"font-size:10pt;font-weight:bold;\"\u003e8060 Mór, Akai út 5.

Я бы хотел преобразовать его в формат "годный к употреблению", поэтому \u0003c будет просто < символом.

В заголовке вызова ajax говорится, что это кодировка iso-8859-2 (тип контента: text / plain; charset = iso-8859-2), но я не уверен.

Я пытался использовать iconv со многими опциями, но безуспешно.

Что интересно, например, этот сайт:

https://www.online-toolz.com/tools/text-unicode-entities-convertor.php

делает трюк без чего-либо, я просто не могу понять, каким должно быть «из кодировки».

Я был бы рад использовать iconv.

Ответы [ 3 ]

1 голос
/ 01 июня 2019

Набор символов просто ASCII. Эти коды перехода используются, например, по JavaScript (и Python).

Если значение, полученное из вызова AJAX, является допустимым JSON (как, предположительно, будет), используйте инструмент JSON для его извлечения.

bash$ jq -r .d <<\:
{"d":"\u003cdiv class=\"popup_title\"\u003eBENTELER Autótechnika Kft.\u003c/div\u003e\u003cdiv style=\"font-size:10pt;font-weight:bold;\"\u003e8060 Mór, Akai út 5."}
:
<div class="popup_title">BENTELER Autótechnika Kft.</div><div style="font-size:10pt;font-weight:bold;">8060 Mór, Akai út 5.
0 голосов
/ 01 июня 2019

Вы можете использовать директиву %b форматирования Bash's printf:

$ encoded='{"d":"\u003cdiv class=\"popup_title\"\u003eBENTELER Autótechnika Kft.\u003c/div\u003e\u003cdiv style=\"font-size:10pt;font-weight:bold;\"\u003e8060 Mór, Akai út 5.'
$ printf -v decoded '%b\n' "$encoded"
$ printf '%s\n' "$decoded"
{"d":"<div class=\"popup_title\">BENTELER Autótechnika Kft.</div><div style=\"font-size:10pt;font-weight:bold;\">8060 Mór, Akai út 5.

Из руководства:

%b
Заставляет printf расширять escape-последовательности обратной косой черты в соответствующем аргументе так же, как echo -e (см. Bash Builtins ).


Как указывает Чарльз в своем комментарии, %b как таковой не ограничивается printf Баша, но требуется POSIX ; интерпретация \u<i>HHHH</i> escape-кодов, с другой стороны, происходит только в Bash, как описано в escape-последовательностях для echo.

0 голосов
/ 01 июня 2019

Самый простой способ сделать это с помощью анализатора JSON для вашего языка, который преобразует его в соответствующую структуру данных и удаляет его.То, что вы видите, - это экранирование Unicode, представляющее U + 003C, то есть символ <.Парсеры JSON часто экранируют угловые скобки, поскольку они имеют особое значение в HTML и XML, и экранирование их означает, что JSON может быть буквально вставлен в документы такого типа.

Альтернативно, если вы хотите экранировать их от командыбез их обработки, вы можете передать это в Perl или Ruby, например:

perl -pe 's/\\u([0-9a-f]+)/"\u{$1}"/ge;'

или

ruby -pe '$_.gsub!(/\\u([0-9a-f]+)/) { |m| m.to_i(16).chr }'

Обратите внимание, что кодировка, полученная с сервера,скорее всего красная сельдь.JSON должен быть в Unicode, и, скорее всего, сервер просто неправильно настроен.Если вы уверены, что данные на самом деле находятся в ISO-8859-2, в нарушение спецификации вы можете исправить это, отправив вывод следующей команды в одну из команд perl или ruby, указанных выше:

iconv -f ISO-8859-2 -t UTF-8
...