Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 6308
Последний выпуск: 19.06.2015

Настройка кодировки в запросах http

15K
17 марта 2012 года
DragonHT
38 / / 02.08.2007
Добрый день!
Пишу некоторое подобие браузера по факту из всех запросов протокола 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");

Может ли кто-нибудь подсказать куда химичить с параметрами чтобы получать нормальные результаты?
316
17 марта 2012 года
Alm3n
889 / / 29.05.2009
Если не ошибаюсь, то это ещё зависит от того, в какой кодировке работает сервер. Когда сам писал запросы, указывал только одну кодировку, может, стоит убрать windows-1251?
Самый лучший способ понять,как нужно писать - посмотреть, как написали или работают другие вещи. Поставь 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.

15K
17 марта 2012 года
DragonHT
38 / / 02.08.2007
Сделал запрос подобный опере:
 
Код:
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");


Всё равно кракозябры, можеть быть это проблемы с кодировкой у 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


А дальше следует просто гора непечатуемых символов, их к сожалению не могу приложить...

15K
17 марта 2012 года
DragonHT
38 / / 02.08.2007
Вроде как разобрался что к чему, достаточно было убрать кодирование в gzip из запроса, я забыл что я при получении кода не перекодирую его обратно из gzip..
Спасибо за помощь!

Правда проблема осталась всё такой-же теперь html сурс приходит нормально, а вот русские символы приходят как непечатуемые, не смотря на то, что в запросе к кодировке не привязываюсь...
15K
17 марта 2012 года
DragonHT
38 / / 02.08.2007
Окончательно заработало, просто незнаю всех премудростей
спасло принудительное выставление кодировки в InputStreamReader

 
Код:
in = new BufferedReader(new InputStreamReader(zsSock.getInputStream(),"cp1251"));
4
17 марта 2012 года
mike
3.7K / / 01.10.2002
Accept-Charset - это список кодировок которые поддерживает браузер. Но никто не гарантирует что сервер вернет данные в одной из этих кодировок. Узнать кодировку HTML документа можно из мета тега "Content-Type" (в заголовке HTML) или из поля Content-Type HTTP ответа. Если кодировка указана и там и там, то браузер должен использовать кодировку из HTTPо ответа.
15K
22 марта 2012 года
DragonHT
38 / / 02.08.2007
Цитата: mike
Accept-Charset - это список кодировок которые поддерживает браузер. Но никто не гарантирует что сервер вернет данные в одной из этих кодировок. Узнать кодировку HTML документа можно из мета тега "Content-Type" (в заголовке HTML) или из поля Content-Type HTTP ответа. Если кодировка указана и там и там, то браузер должен использовать кодировку из HTTPо ответа.


mike, а если ни в ответе от сервера не указана кодировка, ни в заголовке html? Тогда как быть?

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог