Как расшифровать 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 шт):

Автор решения: motpfofs

Попробуйте воспользоваться этим кодом:

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);
}
→ Ссылка
Автор решения: EvgeniyZ

Очень странно, что вы используете такой формат, ибо это формат 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;
}

Result

Видим успешно раскодированное письмо с нужными нам данными.

Мы можем не перегонять в письмо, а лишь раскодировать текст, например так:

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);

Если поиграетесь с этими результатами, то получите нормальный раскодированный текст.

→ Ссылка