2009-08-10 4 views
2

Как я могу прочитать HTTP-поток с HTML-страницей в кодировке страницы?Как получить HTML-страницу в правильной кодировке с помощью Java?

Вот фрагмент кода, который я использую для получения потока HTTP. InputStreamReader имеет необязательный аргумент кодирования, но у меня нет никаких идей о том, как его получить.

URLConnection conn = url.openConnection(); 
InputStream is = conn.getInputStream(); 
BufferedReader d = new BufferedReader(new InputStreamReader(is)); 

ответ

4

Извлечение веб-страницы является достаточно сложным процессом. Вот почему существуют такие библиотеки, как HttpClient. Мой совет заключается в том, что, если у вас нет действительно убедительной причины, используйте HttpClient.

+1

* Обновить *. HttpClient ** был заменен ** на проект [Apache HttpComponents] (http://hc.apache.org/) в его [HttpClient] (http://hc.apache.org/httpcomponents-client-ga) и [Модули HttpCore] (http://hc.apache.org/httpcomponents-core-ga/), которые обеспечивают лучшую производительность и большую гибкость. – informatik01

3

Когда соединение establised через

URLConnection Conn = url.openConnection();

вы можете получить имя метода кодирования через url.getContentEncoding() так передать эту строку InputStreamReader(), так что код выглядит

BufferedReader г = новый BufferedReader (новый InputStreamReader (это, url.getContentEncoding()));

+0

нет метода url.getContentEncoding() :-( – 2009-08-10 16:18:12

+0

Уверен, что есть. Http://java.sun.com/j2se/1.5.0/docs/api/java/net/URLConnection.html#getContentEncoding%28% 29 – Yishai

+0

какая версия java вы используете pal? – Niger

1

Короткий ответ URLConnection.getContentEncoding(). Правильный ответ - это то, что предлагает cletus, использовать соответствующую стороннюю библиотеку, если у вас нет веской причины.

+0

Нет никакой самодовольства, если код не написан в нашей выигранной руке, а ищет сторонний. – Niger

0

У меня была очень похожая проблема для решения недавно. Как и другие ответы, я также начал играть с HttpClient et al. Тем не менее, эти библиотеки требуют, чтобы вы знали заранее кодировку файла, который вы хотите загрузить. В противном случае преобразование полученного HTML-файла приведет к нечитаемым символам.

Этот подход не будет работать, поскольку кодировка HTML-файла указана только в самом файле HTML. В зависимости от версии HTML, кодировка задается многими различными способами, как заголовок XML, два элемента Метатекли разные головы и т.д. Если вы будете следовать этому подходу, вы должны были бы:

  1. Скачать файл и посмотреть на чтобы выяснить кодировку, проанализировав содержимое HTML.
  2. Загрузите файл во второй раз, чтобы указать правильную кодировку.

Особенно синтаксический анализ содержимого HTML для правильных строк кодирования является подверженным ошибкам. Вместо этого я предлагаю вам полагаться на библиотеку, такую ​​как JSoup, которая будет выполнять эту работу за вас. Поэтому вместо загрузки файла через httpclient используйте JSoup для извлечения файла для вас. Кроме того, JSoup предоставляет хороший API для прямого доступа к различным частям HTML-страницы (например, название страницы).