Как определить кодировку веб-страницы - 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);
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д