Расшифровка комбинации windows-1252 и цитируемого печатного HTML

Мне дали фрагмент текста, представляющий HTML, например:

<html>\r\n<head>\r\n<meta http-equiv=3D\"Content-Type\" content=3D\"text/html; charset=3DWindows-1=\r\n252\">\r\n<style type=3D\"text/css\" style=3D\"display:none;\"><!-- P {margin-top:0;margi=\r\nn-bottom:0;} --></style>\r\n</head>\r\n<body dir=3D\"ltr\">This should be a pound sign: =A3 and this should be a long dash: =96 \r\n</body>\r\n</html>\r\n

Из HTML <meta> По тегу я вижу, что кусок HTML должен быть закодирован как Windows-1252.

Я использую node.js для разбора этого фрагмента текста с cheerio, Однако расшифровка с помощью https://github.com/mathiasbynens/windows-1252 не помогает: windows1252.decode(myString); возвращает ту же строку ввода.

Я думаю, что причина в том, что эта входная строка уже закодирована в стандартном наборе символов node.js, но на самом деле она представляет windows-1252 закодированный фрагмент HTML (если это имеет смысл?).

Проверяем эти странные шестнадцатеричные числа перед = Я вижу действительным windows-1252 коды например:

  • этот =\r\n и это \r\n должен как-то представлять возврат каретки в мире Windows,
  • =3D: HEX 3D это DEC 61 который является знаком равенства: =,
  • =96: HEX 96 это DEC 150 что является знаком 'en dash': (своего рода "длинный минус"),
  • =A3: HEX A3 это DEC 163 это знак фунта: £

У меня нет контроля над генерацией этого фрагмента HTML, но я должен анализировать его и очищать, возвращая £ (вместо =A3) так далее.

Теперь я знаю, что могу хранить карту памяти с конверсиями, но мне было интересно, есть ли уже программное решение, которое охватывает все windows-1252 кодировка?

Ср это для всей таблицы переходов: https://www.w3schools.com/charsets/ref_html_ansi.asp

Редактировать:

Входной HTML-код поступает из сеанса IMAP, поэтому кажется, что в восходящем потоке происходит 7-битная / 8-битная "кодировка для печати в кавычках", которой я не могу управлять (см. https://en.wikipedia.org/wiki/Quoted-printable).

Тем временем я узнал об этой дополнительной кодировке, и я попробовал это quoted-printable (см. https://github.com/mathiasbynens/quoted-printable) библиотека без удачи.

Ниже приводится MCV (согласно запросу):

var cheerio = require('cheerio');
var windows1252 = require('windows-1252');
var quotedPrintable = require('quoted-printable');

const inputString = '<html>\r\n<head>\r\n<meta http-equiv=3D\"Content-Type\" content=3D\"text/html; charset=3DWindows-1=\r\n252\">\r\n<style type=3D\"text/css\" style=3D\"display:none;\"><!-- P {margin-top:0;margi=\r\nn-bottom:0;} --></style>\r\n</head>\r\n<body dir=3D\"ltr\">This should be a pound sign: =A3 and this should be a long dash: =96 \r\n</body>\r\n</html>\r\n'
const $ = cheerio.load(inputString, {decodeEntities: true});
const bodyContent = $('html body').text().trim();
const decodedBodyContent = windows1252.decode(bodyContent);

console.log(`The input string: "${bodyContent}"`);
console.log(`The output string: "${decodedBodyContent}"`);

if (bodyContent === decodedBodyContent) {
  console.log('The windows1252 output seems the same of as the input');
}

const decodedQp = quotedPrintable.decode(bodyContent)
console.log(`The decoded QP string: "${decodedQp}"`);

Предыдущий скрипт производит следующий вывод:

The input string: "This should be a pound sign: =A3 and this should be a long dash: =96"
The output string: "This should be a pound sign: =A3 and this should be a long dash: =96"
The windows1252 output seems the same of as the input
The decoded QP string: "This should be a pound sign: £ and this should be a long dash: "

В моей командной строке я не вижу длинную черту, и я не уверен, как я мог правильно декодировать все эти =<something> закодированные символы?

1 ответ

Решение

Похоже, что сообщение, полученное через IMAP, содержит комбинацию из 2 разных кодировок:

  • фактическая строка кодируется в соответствии с кодировкой "цитируемая для печати" ( https://en.wikipedia.org/wiki/Quoted-printable), потому что я думаю, что есть проблема с отображением 7-бит /8-бит при передаче этой информации через канал IMAP (соединение через сокет TCP)
  • логическое представление содержимого (тело письма), которое является HTML с <meta> тег с кодировкой Windows-1252

Существует также "проблема" с этими кусками HTML, которые содержат много возвратов каретки во вкусе Windows (\r\n). Мне пришлось предварительно обработать строку, чтобы справиться с этим, в моем случае: удалить эти возвраты каретки.

Следующий пример MCV должен показать процесс очистки и проверки содержимого строки, представляющей тело письма:

var quotedPrintable = require('quoted-printable');
var windows1252 = require('windows-1252');

const inputStr = 'This should be a pound sign: =A3 \r\nand this should be a long dash: =96\r\n';
console.log(`The original string: "${inputStr}"`);

// 1. clean the "Windows carriage returns" (\r\n)
const cleandStr = inputStr.replace(/\r\n/g, '');
console.log(`The string without carriage returns: "${cleandStr}"`);

// 2. decode using the "quoted printable protocol"
const decodedQp = quotedPrintable.decode(cleandStr)
console.log(`The decoded QP string: "${decodedQp}"`);

// 3. decode using the "windows-1252"
const windows1252DecodedQp = windows1252.decode(decodedQp);
console.log(`The windows1252 decoded QP string: "${windows1252DecodedQp}"`);

Что дает этот вывод:

The original string: "This should be a pound sign: =A3
and this should be a long dash: =96
"
The string without carriage returns: "This should be a pound sign: =A3 and this should be a long dash: =96"
The decoded QP string: "This should be a pound sign: £ and this should be a long dash: "
The windows1252 decoded QP string: "This should be a pound sign: £ and this should be a long dash: –"

Обратите внимание на "длинную черточку", которая отображается по-разному до / после фазы декодирования Windows-1252.

Afaik, это не имеет ничего общего с кодировкой / декодированием UTF-8. Я смог выяснить "порядок декодирования" процедуры из этого: https://github.com/mathiasbynens/quoted-printable/issues/5

В одном я не уверен, что операционная система, на которой я запускаю этот фрагмент кода, каким-то образом влияет на кодировки / кодировки файлов или потоков строк.

npm пакеты, которые я использовал:

Другие вопросы по тегам