Расшифровка комбинации 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
: HEX3D
это DEC61
который является знаком равенства:=
,=96
: HEX96
это DEC150
что является знаком 'en dash':–
(своего рода "длинный минус"),=A3
: HEXA3
это DEC163
это знак фунта:£
У меня нет контроля над генерацией этого фрагмента 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
пакеты, которые я использовал: