Как определить кодировку веб-страницы - C#
Формулировка задачи:
Написал парсер страниц. но некоторые страницы с русским текстом отображаются не правильно в textBox
проверяю контекст и если там есть "windows-1251" то сделать конвертацию. но стало ещё хуже..... новые кракозяблы появились
конвертировать пробую так
и как выше описал.
не получается.
Что не так. ?
например страница http://www. liveinternet. ru/member.php?action=lostpw немогу получить коректно <title> знаки вопроса ресует
WebRequest request = WebRequest.Create(urlString); WebResponse response = request.GetResponse(); var cont = response.ContentType; Stream stream = response.GetResponseStream(); if (stream != null) { using (StreamReader sr = new StreamReader(stream)) { str = sr.ReadToEnd(); if (cont.Contains("windows-1251")) { Encoding utf = Encoding.UTF8; Encoding win = Encoding.GetEncoding(1251); byte[] utfArr = utf.GetBytes(str); byte[] winArr = Encoding.Convert(win, utf, utfArr); char[] winChars = new char[utf.GetCharCount(winArr, 0, winArr.Length)]; utf.GetChars(winArr, 0, winArr.Length, winChars, 0); string setNew = new string(winChars); } } }
byte[] bStr = Encoding.GetEncoding(1251).GetBytes(str); string setNew = Encoding.Default.GetString(bStr);
Решение задачи: «Как определить кодировку веб-страницы»
textual
Листинг программы
string DownloadString(string address) { return DownloadString(address, Encoding.UTF8); } string DownloadString(string address, Encoding defaultEncoding) { if (defaultEncoding == null) throw new ArgumentNullException("defaultEncoding"); byte[] data; string contentTypeHeader = null; using (WebClient webClient = new WebClient()) { data = webClient.DownloadData(address); contentTypeHeader = webClient.ResponseHeaders[HttpResponseHeader.ContentType]; } Regex reCharset = new Regex(@"charset=""?([0-9a-zA-Z-]+)""?", RegexOptions.IgnoreCase | RegexOptions.CultureInvariant); Encoding responseEncoding = null; string charset = null; if (contentTypeHeader != null) { Match m = reCharset.Match(contentTypeHeader); if (m.Success) { charset = m.Groups[1].Value; Debug.WriteLine("DownloadString. Encoding from ContentType header=" + charset); } } if (charset == null) { // Заголовок Content-Type отсуствует или не содержит имя кодировки // Ищем тег <meta http-equiv="Content-Type" content="text/html; charset=NAME"> // или тег <meta charset="utf-8"> string begin = Encoding.ASCII.GetString(data, 0, Math.Min(data.Length, 2048)); int pos = 0; for(;;) { int start = begin.IndexOf("<meta", pos); if (start == -1) break; int end = begin.IndexOf(">", start+5); if (end == -1) break; Match m = reCharset.Match(begin, start, end-start); if (m.Success) { charset = m.Groups[1].Value; Debug.WriteLine("DownloadString. Encoding from meta=" + charset); break; } pos = end + 1; } } /* Устанавливаем пакет UDE.Charp и снимаем коментарий if (charset == null) { // Кодировка не указана ни в заголовке ни в мета-теге // Пытаемся угадать! Ude.CharsetDetector d = new Ude.CharsetDetector(); d.Feed(data, 0, data.Length); d.DataEnd(); if (d.Confidence > 0.8f) charset = d.Charset; }*/ if (charset != null) { try { responseEncoding = Encoding.GetEncoding(charset); } catch (ArgumentException) { } } responseEncoding = responseEncoding ?? defaultEncoding; return responseEncoding.GetString(data); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д