Проблема декодирования текста - PullRequest
1 голос
/ 05 апреля 2010

Итак, с учетом этой входной строки:

=?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();

        }

Результат совпадает с данными, извлеченными из входной строки. Что я делаю не так, что этот текст не декодируется должным образом?

UPDATE

Итак, у меня есть этот код для расшифровки цитаты для печати:

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 ]

3 голосов
/ 05 апреля 2010

Похоже, вы не до конца понимаете формат строки ввода. Проверьте это здесь: http://www.ietf.org/rfc/rfc2047.txt формат: encoded-word = "=?" charset "?" encoding "?" encoded-text "?="

так что вы должны

  1. Extranct charset (кодировка в терминах .net). Не только UTF8 или по умолчанию (Utf16)
  2. Извлечение кодировки: либо B для base64 Q для цитируемой печати (ваш случай!)
  3. Затем выполнить декодирование в байты, затем в строку
2 голосов
/ 05 апреля 2010
  1. Функция даже не пытается декодировать закодированный кодированный материал (шестнадцатеричные коды и подчеркивания). Вы должны добавить это.
  2. Он неправильно обрабатывает кодировку (UTF-8 декодируется с Encoding.ASCII по какой-то странной причине)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...