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

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

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

Написал парсер страниц. но некоторые страницы с русским текстом отображаются не правильно в textBox
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);
                        }
                    }
                }
проверяю контекст и если там есть "windows-1251" то сделать конвертацию. но стало ещё хуже..... новые кракозяблы появились конвертировать пробую так
                           
     byte[] bStr = Encoding.GetEncoding(1251).GetBytes(str);
     string setNew = Encoding.Default.GetString(bStr);
и как выше описал. не получается. Что не так. ? например страница http://www. liveinternet. ru/member.php?action=lostpw немогу получить коректно <title> знаки вопроса ресует

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

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);
}

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


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

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

7   голосов , оценка 3.714 из 5
Похожие ответы