Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > определение кодировки у сайта


Автор: wester 27.6.2011, 22:15
Доброго времени суток.

Дан сайт, в исходнике которого написано 
Цитата

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />

пытаюсь скачать страницу этого сайта на диск 

Код

// запись в файл
internal void SetSourceToFile(string source, string fileName)
        {
            using (var sw = new StreamWriter(fileName, false, enc1251))
            {
                sw.Write(source);
                sw.Flush();
                sw.Close();
            }
        }
private Encoding enc1251 = Encoding.GetEncoding(1251);
// запись исходника в переменную
 internal string GetHtmlSource(HttpWebRequest webRequest)
        {
            var webResp = webRequest.GetResponse();
            string source;
            using (var webRespReader = new StreamReader(webResp.GetResponseStream(),enc1251))
            {
                source = webRespReader.ReadToEnd();
            }


            return source;
        }


в результате на диск получаю абракадабру.
при формировании HttpWebRequest я указываю необходимый хидер
Цитата

webRequest.Headers.Add(HttpRequestHeader.AcceptCharset, "windows-1251,utf-8;q=0.7,*;q=0.7");

Автор: Keanor 28.6.2011, 05:30
Вот выдрал из своего текущего проекта. Работает на ура.

Код

WebClient client = new WebClient();
                try
                {
                    Stream data = client.OpenRead(url);
                    StreamReader reader = new StreamReader(data, Encoding.GetEncoding("windows-1251"));
                    string pageText = reader.ReadToEnd();
                    reader.Close();
                    data.Close();


Accept-Charset

Заголовок Accept-Charset относится к группе заголовков посвященных согласованию содержимого. Он отвечает за согласование кодировок. Если ресурс на сервере представлен в нескольких кодировках, то клиенту предоставляется возможность выбрать наиболее для него предпочтительную. читать больше - http11[dot]ru/post.php?post=19

ЗЫ: Изредко бывает что в meta сайта висит неправильная кодировка. Проверь браузером действительно ли там 1251.

Автор: wester 28.6.2011, 09:52
Keanor
Браузером определяется windows-1251. Суть в том, что мне необходимо использовать HttpWebRequest, т.к. я передаю еще куки и другие хидеры сайту.
вот код как формирую HttpWebRequest для сайта

Код

internal HttpWebRequest InitWebRequest(
                                            string method,
                                            string uri,
                                            string refferer,
                                            bool autoRedirect,
                                            bool useCookie)
{
    var webRequest = (HttpWebRequest)WebRequest.Create(uri);

    // выставляем нужные header
    webRequest.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.13) Gecko/20101203 AskTbFXTV5/3.9.1.14019 Firefox/3.6.13";
    webRequest.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
    webRequest.Headers.Add(HttpRequestHeader.AcceptLanguage, "ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3");
    webRequest.Headers.Add(HttpRequestHeader.AcceptCharset, "windows-1251,utf-8;q=0.7,*;q=0.7");
    webRequest.ContentType = "application/x-www-form-urlencoded";
    webRequest.Host = "free-torrents.org";
    webRequest.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip, deflate");
    webRequest.Method = method;
    webRequest.KeepAlive = true;
    webRequest.Headers.Add(HttpRequestHeader.CacheControl, "max-age=0");
    webRequest.Timeout = 99000;
    //   webRequest.Proxy = new WebProxy("localhost", 8888); // note прослушка на локалхосте
    webRequest.AllowAutoRedirect = autoRedirect;
    webRequest.Referer = refferer;
    if (useCookie)
    {
        webRequest.Headers.Add(HttpRequestHeader.Cookie, Properties.Settings.Default.Cookie);
    }

    return webRequest;
}


проблему решил, строка была сжата gzip

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)