Проблема декодирования текста
Итак, учитывая эту входную строку:
=?ISO-8859-1?Q?TEST=2C_This_Is_A_Test_of_Some_Encoding=AE?=
И эта функция:
private string DecodeSubject(string input)
{
StringBuilder sb = new StringBuilder();
MatchCollection matches = Regex.Matches(inputText.Text, @"=\?(?<encoding>[\S]+)\?.\?(?<data>[\S]+[=]*)\?=");
foreach (Match m in matches)
{
string encoding = m.Groups["encoding"].Value;
string data = m.Groups["data"].Value;
Encoding enc = Encoding.GetEncoding(encoding.ToLower());
if (enc == Encoding.UTF8)
{
byte[] d = Convert.FromBase64String(data);
sb.Append(Encoding.ASCII.GetString(d));
}
else
{
byte[] bytes = Encoding.Default.GetBytes(data);
string decoded = enc.GetString(bytes);
sb.Append(decoded);
}
}
return sb.ToString();
}
Результат совпадает с данными, извлеченными из входной строки. Что я делаю неправильно, что этот текст не декодируется должным образом?
ОБНОВИТЬ
Так что у меня есть этот код для декодирования цитата для печати:
public string DecodeQuotedPrintable(string encoded)
{
byte[] buffer = new byte[1];
return Regex.Replace(encoded, "=(\r\n?|\n)|=([A-F0-9]{2})", delegate(Match m)
{
if (byte.TryParse(m.Groups[2].Value, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out buffer[0]))
{
return Encoding.ASCII.GetString(buffer);
}
else
{
return string.Empty;
}
});
}
И это только оставляет подчеркивание. Должен ли я вручную конвертировать их в пробелы (Заменить ("_"," ")), или есть что-то еще, что мне нужно сделать, чтобы справиться с этим?
2 ответа
Решение
Похоже, вы не до конца понимаете формат строки ввода. Проверьте это здесь: http://www.ietf.org/rfc/rfc2047.txt формат: encoded-word = "=?" charset "?" encoding "?" encoded-text "?="
так что вы должны
- Extranct charset(кодировка в терминах.net). Не только UTF8 или по умолчанию (Utf16)
- Извлеките кодировку: либо B для base64, Q для цитируемой для печати (ваш случай!)
- Затем выполните декодирование в байты, затем в строку
- Функция даже не пытается декодировать закодированные для печати закодированные данные (шестнадцатеричные коды и подчеркивания). Вы должны добавить это.
- It's handling the encoding wrong (UTF-8 gets decoded with
Encoding.ASCII
for some bizarre reason)