Как расшифровать quoted-printable текст из mhtml?
Есть файл в формате mhtml. Как его раскодировать его quoted-printable содержимое в обычный текст, сохранив теги?
<th width=3D"5%">=D0=A5=D0=BE=D0=B7=D1=8F=D0=B9=D1=81=D1=82=D0=B2=
=D1=83=D1=8E=D1=89=D0=B8=D0=B9 =D1=81=D1=83=D0=B1=D1=8A=D0=B5=D0=BA=D1=82 (=
=D0=B2=D0=BB=D0=B0=D0=B4=D0=B5=D0=BB=D0=B5=D1=86 =D0=BF=D1=80=D0=BE=D0=B4=
=D1=83=D0=BA=D1=86=D0=B8=D0=B8)</th>
Ответы (2 шт):
Попробуйте воспользоваться этим кодом:
public static string DecodeQuotedPrintables(string input, Encoding encoding)
{
var regex = new Regex(@"\=(?<Symbol>[0-9A-Z]{2})", RegexOptions.Multiline);
var matches = regex.Matches(input);
var bytes = new byte[matches.Count];
for (var i = 0; i < matches.Count; i++)
{
bytes[i] = Convert.ToByte(matches[i].Groups["Symbol"].Value, 16);
}
return encoding.GetString(bytes);
}
Очень странно, что вы используете такой формат, ибо это формат Email сообщений, который мало кем используется напрямую. Обычно есть некие механизмы, которые позволяют из него сразу получить нужный текст, а не так, как у вас идет "снимок" письма. Так что советую внимательней посмотреть там, где вы получаете это на наличие тех самых механизмов.
Ну хорошо, допустим нам надо раскодировать эти крякозябли в читаемый вид, как быть? Да, по сути, все просто, нам надо лишь знать, что это и в какой кодировки написано.
- Письмо это в стандарте RFC 2047.
- Кодировку мы можем определить например по этому
Subject: =?utf-8?или по этому@charset "utf-8";тексту. - Дальше нас интересует это
Content-Transfer-Encoding: quoted-printable.
Имея все это мы без труда можем найти некий "декодер", который раскодирует нам письмо, первая ссылка в гугле мне лично дала это RFC2047Decoder, по его примеру вы можете написать все, что вам необходимо. Лично я попробовал, отработал на ура, с одним но - в заголовке проблема с кодировкой.
Другим способом, может быть использование некой специализирующейся на Email сообщениях утилите, на ум приходит весьма мощный комбайн под названием MimeKit, который имеет на своем борту все необходимое для работы с данным стандартом.
К примеру, мы можем спарсить этот текст, как письмо. Я возьму ту ссылку, что вы дали, открою Stream и из него буду брать само письмо, вы же можете это заменить на путь к файлу или еще как вам нужно.
private static readonly HttpClient client = new HttpClient();
static async Task Main(string[] args)
{
var textStream = await client.GetStreamAsync("https://pastebin.com/raw/643TX3Td");
var message = MimeMessage.Load(textStream);
var body = message.HtmlBody;
var date = message.Date;
var subject = message.Subject;
}
Видим успешно раскодированное письмо с нужными нам данными.
Мы можем не перегонять в письмо, а лишь раскодировать текст, например так:
var text = MimeKit.Utils.Rfc2047.DecodeText(textBytes);
Можем сделать так:
var decoder = new QuotedPrintableDecoder();
var buffer = Encoding.UTF8.GetBytes(text);
var output = new byte[decoder.EstimateOutputLength(buffer.Length)];
int used = decoder.Decode(buffer, 0, buffer.Length, output);
var result = Encoding.UTF8.GetString(output, 0, used);
Если поиграетесь с этими результатами, то получите нормальный раскодированный текст.
