Настройка кодировки в запросах http
Пишу некоторое подобие браузера по факту из всех запросов протокола HTTP используется только GET.
Всё отлично работает, но есть проблема, при получении исходного кода с некторых сайтов сваливаются краказябры.
Если я правильно понял описание поля запроса Accept-Charset, то именно оно отвечает за кодировку получаемых данных.
На данный момент запрос выглядит следующим образом следующим образом:
Код:
out.println("GET / HTTP/1.1\r\n"
+ "Host: "+UrlField.getText()+"\r\n"
+ "Connection: keep-alive\r\n"
+ "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n"
+ "Accept-Encoding: gzip,deflate,sdch\r\n"
+ "Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4\r\n"
+ "Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.3\r\n");
+ "Host: "+UrlField.getText()+"\r\n"
+ "Connection: keep-alive\r\n"
+ "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n"
+ "Accept-Encoding: gzip,deflate,sdch\r\n"
+ "Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4\r\n"
+ "Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.3\r\n");
Может ли кто-нибудь подсказать куда химичить с параметрами чтобы получать нормальные результаты?
Самый лучший способ понять,как нужно писать - посмотреть, как написали или работают другие вещи. Поставь Wireshark, поставь какоу-нибудь фильтр типа tcp.port == 80 && http.request.method == GET и обратись к какой-нибуь странице через браузер. Вот какой запрос у меня, когда обращаюсь к forum.codenet.ru
Цитата:
GET / HTTP/1.1
User-Agent: Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.10.229 Version/11.61
Host: forum.codenet.ru
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
Accept-Encoding: gzip, deflate
Cookie: bb_lastvisit=1327972363; bb_lastactivity=0
Cache-Control: no-cache
Connection: Keep-Alive
Accept-Charset в логе вообще нет. Можно не использовать сторонний сниффер, в Opera есть Dragonfly, в Mozila - Firebug.
Код:
out.println("GET / HTTP/1.1\r\n"
+ "User-Agent: ZombieSites/0.1\r\n"
+ "Host: "+UrlField.getText()+"\r\n"
+ "Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\n"
+ "Accept-Language: ru-RU,ru;q=0.9,en;q=0.8\r\n"
+ "Accept-Encoding: gzip,deflate\r\n"
+ "Connection: Keep-Alive\r\n");
+ "User-Agent: ZombieSites/0.1\r\n"
+ "Host: "+UrlField.getText()+"\r\n"
+ "Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1\r\n"
+ "Accept-Language: ru-RU,ru;q=0.9,en;q=0.8\r\n"
+ "Accept-Encoding: gzip,deflate\r\n"
+ "Connection: Keep-Alive\r\n");
Всё равно кракозябры, можеть быть это проблемы с кодировкой у BufferReader
Код:
in = new BufferedReader(new InputStreamReader(zsSock.getInputStream()));
Сервер отдаёт код 200 - всё окей,
Цитата:
HTTP/1.1 200 Ok
Server: nginx
Date: Sat, 17 Mar 2012 11:18:41 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: close
Cache-Control: no-cache,no-store,max-age=0,must-revalidate
Expires: Sat, 17 Mar 2012 11:18:41 GMT
Last-Modified: Sat, 17 Mar 2012 11:18:41 GMT
P3P: policyref="/w3c/p3p.xml", CP="NON DSP ADM DEV PSD IVDo OUR IND STP PHY PRE NAV UNI"
Set-Cookie: yandexuid=3848548181331983121; Expires=Tue, 15-Mar-2022 11:18:41 GMT; Domain=.ya.ru; Path=/
X-XRDS-Location: http://openid.yandex.ru/server_xrds/
Content-Encoding: gzip
Server: nginx
Date: Sat, 17 Mar 2012 11:18:41 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: close
Cache-Control: no-cache,no-store,max-age=0,must-revalidate
Expires: Sat, 17 Mar 2012 11:18:41 GMT
Last-Modified: Sat, 17 Mar 2012 11:18:41 GMT
P3P: policyref="/w3c/p3p.xml", CP="NON DSP ADM DEV PSD IVDo OUR IND STP PHY PRE NAV UNI"
Set-Cookie: yandexuid=3848548181331983121; Expires=Tue, 15-Mar-2022 11:18:41 GMT; Domain=.ya.ru; Path=/
X-XRDS-Location: http://openid.yandex.ru/server_xrds/
Content-Encoding: gzip
А дальше следует просто гора непечатуемых символов, их к сожалению не могу приложить...
Спасибо за помощь!
Правда проблема осталась всё такой-же теперь html сурс приходит нормально, а вот русские символы приходят как непечатуемые, не смотря на то, что в запросе к кодировке не привязываюсь...
спасло принудительное выставление кодировки в InputStreamReader
Код:
in = new BufferedReader(new InputStreamReader(zsSock.getInputStream(),"cp1251"));
Accept-Charset - это список кодировок которые поддерживает браузер. Но никто не гарантирует что сервер вернет данные в одной из этих кодировок. Узнать кодировку HTML документа можно из мета тега "Content-Type" (в заголовке HTML) или из поля Content-Type HTTP ответа. Если кодировка указана и там и там, то браузер должен использовать кодировку из HTTPо ответа.
Цитата: mike
Accept-Charset - это список кодировок которые поддерживает браузер. Но никто не гарантирует что сервер вернет данные в одной из этих кодировок. Узнать кодировку HTML документа можно из мета тега "Content-Type" (в заголовке HTML) или из поля Content-Type HTTP ответа. Если кодировка указана и там и там, то браузер должен использовать кодировку из HTTPо ответа.
mike, а если ни в ответе от сервера не указана кодировка, ни в заголовке html? Тогда как быть?