Как заменить символы ISO-8889 и шестнадцатеричное представление прямым способом? - PullRequest
0 голосов
/ 25 марта 2020

У меня есть файл HTML, для которого я хочу преобразовать коды ISO-8859-1 в UTF-8.

иногда в файле появляется специальный символ в этом формате

&#x200
&#x203

и иногда специальные символы появляются в этом формате

 È
 Ë

В обоих случаях я хотел бы заменить их на HTML, как показано ниже:

 È
 Ë

Я пытался с awk сделать так:

awk '{gsub(/\200/, "\\È" , $0); print}' file

Но в этом случае заменяется только È, но не его эквивалент &#x200.

Есть ли способ заменить эти символы в одной / прямой команде или необходимо рассмотреть оба пути? Я имею в виду, как сделать следующее для каждого символа?

awk '{ gsub(/\&#x200/, "\\È" , $0)
       gsub(/\200/,    "\\È" , $0); print}' file

Если есть более эффективный способ сделать это или с помощью другого инструмента, я открыт для предложений. Заранее спасибо.

1 Ответ

2 голосов
/ 25 марта 2020

В одну сторону, используя модуль perl HTML :: Entities (доступен через менеджер пакетов ОС или CPAN, если он еще не установлен) для преобразования всех сущностей и не -ASCII символы:

$ cat example.html
<!DOCTYPE html>
<html>
  <head>
  </head>
  <body>
    <p>Testing &#200; and &#203;
    <p>Testing È and Ë
  </body>
</html>
$ file example.html
example.html: HTML document, ISO-8859 text
$ perl -Mopen=IN,":encoding(iso-8859-1)" -MHTML::Entities -ne \
    'print encode_entities(decode_entities($_), "^\n\x20-\x25\x27-\x7e")' example.html
<!DOCTYPE html>
<html>
  <head>
  </head>
  <body>
    <p>Testing &Egrave; and &Euml;
    <p>Testing &Egrave; and &Euml;
  </body>
</html>
...