Как определить кодировку веб-страницы - C#

Узнай цену своей работы

Формулировка задачи:

Написал парсер страниц. но некоторые страницы с русским текстом отображаются не правильно в textBox
Листинг программы
  1. WebRequest request = WebRequest.Create(urlString);
  2. WebResponse response = request.GetResponse();
  3. var cont = response.ContentType;
  4. Stream stream = response.GetResponseStream();
  5. if (stream != null)
  6. {
  7. using (StreamReader sr = new StreamReader(stream))
  8. {
  9. str = sr.ReadToEnd();
  10. if (cont.Contains("windows-1251"))
  11. {
  12. Encoding utf = Encoding.UTF8;
  13. Encoding win = Encoding.GetEncoding(1251);
  14. byte[] utfArr = utf.GetBytes(str);
  15. byte[] winArr = Encoding.Convert(win, utf, utfArr);
  16. char[] winChars = new char[utf.GetCharCount(winArr, 0, winArr.Length)];
  17. utf.GetChars(winArr, 0, winArr.Length, winChars, 0);
  18. string setNew = new string(winChars);
  19. }
  20. }
  21. }
проверяю контекст и если там есть "windows-1251" то сделать конвертацию. но стало ещё хуже..... новые кракозяблы появились конвертировать пробую так
Листинг программы
  1. byte[] bStr = Encoding.GetEncoding(1251).GetBytes(str);
  2. string setNew = Encoding.Default.GetString(bStr);
и как выше описал. не получается. Что не так. ? например страница http://www. liveinternet. ru/member.php?action=lostpw немогу получить коректно <title> знаки вопроса ресует

Решение задачи: «Как определить кодировку веб-страницы»

textual
Листинг программы
  1. string DownloadString(string address)
  2. {
  3.     return DownloadString(address, Encoding.UTF8);
  4. }
  5.  
  6. string DownloadString(string address, Encoding defaultEncoding)
  7. {
  8.     if (defaultEncoding == null) throw new ArgumentNullException("defaultEncoding");
  9.    
  10.     byte[] data;
  11.     string contentTypeHeader = null;
  12.     using (WebClient webClient = new WebClient())
  13.     {
  14.         data = webClient.DownloadData(address);
  15.         contentTypeHeader = webClient.ResponseHeaders[HttpResponseHeader.ContentType];
  16.     }
  17.    
  18.     Regex reCharset = new Regex(@"charset=""?([0-9a-zA-Z-]+)""?", RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);
  19.    
  20.     Encoding responseEncoding = null;
  21.     string charset = null;
  22.    
  23.     if (contentTypeHeader != null)
  24.     {
  25.         Match m = reCharset.Match(contentTypeHeader);
  26.         if (m.Success)
  27.         {
  28.             charset = m.Groups[1].Value;
  29.             Debug.WriteLine("DownloadString. Encoding from ContentType header=" + charset);
  30.         }
  31.     }
  32.     if (charset == null)
  33.     {
  34.         // Заголовок Content-Type отсуствует или не содержит имя кодировки
  35.         // Ищем тег <meta http-equiv="Content-Type" content="text/html; charset=NAME">
  36.         //     или тег <meta charset="utf-8">
  37.         string begin = Encoding.ASCII.GetString(data, 0, Math.Min(data.Length, 2048));
  38.         int pos = 0;
  39.         for(;;)
  40.         {
  41.             int start = begin.IndexOf("<meta", pos);
  42.             if (start == -1) break;
  43.             int end = begin.IndexOf(">", start+5);
  44.             if (end == -1) break;
  45.            
  46.             Match m = reCharset.Match(begin, start, end-start);
  47.             if (m.Success)
  48.             {
  49.                 charset = m.Groups[1].Value;
  50.                 Debug.WriteLine("DownloadString. Encoding from meta=" + charset);
  51.                 break;
  52.             }
  53.            
  54.             pos = end + 1;
  55.         }
  56.     }
  57.     /* Устанавливаем пакет UDE.Charp и снимаем коментарий
  58.     if (charset == null)
  59.     {
  60.         // Кодировка не указана ни в заголовке ни в мета-теге
  61.         // Пытаемся угадать!
  62.         Ude.CharsetDetector d = new Ude.CharsetDetector();
  63.         d.Feed(data, 0, data.Length);
  64.         d.DataEnd();
  65.         if (d.Confidence > 0.8f) charset = d.Charset;
  66.     }*/
  67.    
  68.     if (charset != null)
  69.     {
  70.         try { responseEncoding = Encoding.GetEncoding(charset); }
  71.         catch (ArgumentException) { }
  72.     }
  73.    
  74.     responseEncoding = responseEncoding ?? defaultEncoding;
  75.     return responseEncoding.GetString(data);
  76. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.714 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы