Создание Windows-приложений на основе Visual C#

         

Класс Utils.cs


Листинг 3.8.

(html, txt)


// Добавляем кодировку в память класса. knownEncodings.Add(charset, e); // Возвращаем кодировку. return e; }

/// <summary> /// Исключаем "byte-stuffed", следуя RFC1939 /// \r\n.[not \r\n] => \r\n[not \r\n] /// </summary> /// <param name="s"></param> /// <returns></returns> public static string RemoveByteStuffedSequence(string s) { Regex r = new Regex(@"(?<=\r\n)\.(?!\r\n)"); return r.Replace(s, ""); }

/// <summary> /// Декодируем строку /// </summary> /// <param name="s">Строка</param> /// <returns></returns> static public string DecodeQuotedPrintable(string s, Encoding e) { _curEncoding = e; Regex re = new Regex(@"=([a-fA-F0-9]{2})"); return re.Replace(s, new MatchEvaluator(ReDigit)); }

static Encoding _curEncoding; /// <summary> /// Конвертирует "ХХ" в байтовый аналог /// </summary> /// <param name="match">"XX" формат</param> /// <returns></returns> static string ReDigit(Match match) { byte [] tmp = {Convert.ToByte(match.Groups[1].Value, 16)}; return "" + _curEncoding.GetString(tmp); }

/// <summary> /// RFC 2047 /// </summary> /// <param name="s"<</param> /// <returns<</returns> static public string WordDecoder(string input) { string charset = ""; string src; string tmp; src = input; Match m = Regex.Match(input, @"(?<ew>(?<n>\=\?(?<charset>[^?]+)\?(?<encoding>[QqBb])\?(?<content>[^?]+)\?\=)(\r\n)*\s*)(?=(?<isnext>\=\?[^?]+\?[QqBb]\?[^?]+\?\=)*)", RegexOptions.Multiline); if (m.Success) { while (m.Success) { charset = m.Groups["charset"].Value; string encoding = m.Groups["encoding"].Value.ToLower(); switch(encoding) { case "q": tmp = m.Groups["content"].Value.Replace("_", " "); tmp = DecodeQuotedPrintable(tmp, GetEncoding(m.Groups["charset"].Value)); break;

case "b": tmp = GetEncoding(charset).GetString(Convert.FromBase64String(m.Groups["content"].Value)); break;

default: throw new ParseException("Неизвестный метод кодировки"); }

src = src.Replace(((m.Groups["isnext"].Value.Length == 0) ? m.Groups["n"].Value : m.Groups["ew"].Value), tmp); m = m.NextMatch(); }

return src; }

return GetEncoding(charset).GetString(Encoding.Default.GetBytes(src)); } } }

Листинг 3.8.


Содержание раздела