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


           

Архив кодировок. static Hashtable knownEncodings


using System; using System.Text.RegularExpressions; using System.Collections; using System.Text; using System.Web;
namespace Mail { /// <summary> /// Класс, содержащий общие функции. /// </summary> public class Utils { // Архив кодировок. static Hashtable knownEncodings = new Hashtable();
static Utils() {
} /// <summary> /// Извлечение простого текста из HTML-текста. /// </summary> /// <param name="html">HTML текст.</param> /// <returns>Простой текст.</returns> public static string ExtractTextFromHtml(string html) { // С помощью регулярных выражений удаляем или заменяем // HTML-теги. // удаление <!DOCTYPE ... > Regex r = new Regex(@"<![^>]+>"); // Создание регулярного выражения. html = r.Replace(html, ""); // Замена подходящей части текста на пустую строку.
// удаление <head>...</head> r = new Regex(@"<head>.*?</head>", RegexOptions.IgnoreCase); // Создание регулярного выражения. // r = new Regex(@"<style[^>]+[>].*?</style>", RegexOptions.IgnoreCase); html = r.Replace(html, ""); // Замена подходящей части текста на пустую строку. // представляем, что </div>, <br />, </p> — это новая строка r = new Regex(@"(</div>|<[/]?br[^>]+>|</p>)", RegexOptions.IgnoreCase); // Создание регулярного выражения. html = r.Replace(html, "\r\n"); // Замена подходящей части текста на символы перехода на новую строку.
// удаление всех тегов <...> r = new Regex(@"<[^>]+>", RegexOptions.Multiline); // Создание регулярного выражения, удаляющего все оставшиеся теги. html = r.Replace(html, ""); html = HttpUtility.HtmlDecode(html); return html; }
/// <summary> /// Возвращение кодировки текста. /// </summary> /// <param name="charset">Текст, содержащий название кодировки.</param> /// <returns></returns> public static Encoding GetEncoding(string charset) { // Проверяем, есть ли данная кодировка в памяти класса, // и если есть, возвращаем ее. if (knownEncodings.ContainsKey(charset)) { return (Encoding)knownEncodings[charset]; } // Если кодировка не обнаружена, начинаем анализировать строку. Encoding e = Encoding.Default; try { e = Encoding.GetEncoding(charset); } catch {}
// Добавляем кодировку в память класса. 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.
Закрыть окно
Содержание  Назад  Вперед