Как я получу кодировку страницы, прежде чем загрузить ее? - PullRequest
1 голос
/ 07 мая 2011

Мне нужно получить кодировку веб-страницы (UTF-8, ISO-8859-1 и т. Д.) Перед загрузкой, потому что я преобразую ее из загруженного InputStream в String с использованием кодирования.

Я использую HttpUrlConnection и есть метод getContentEncoding, но он будет возвращаться только в том случае, если сервер отправит его.

В некоторых случаях кодировка находится в атрибуте charset (HTML4?), В других - в кодировке атрибута.(XHTML) и другие, которых я не знаю, но я предполагаю, что есть другие формы.

Есть какой-то класс, который делает это или как это сделать?

Ответы [ 3 ]

1 голос
/ 07 мая 2011

Спецификация HTTP 1.1 указывает, что Content-Type "должен" использоваться для указания содержимого, и что ответы, которые не включают этот заголовок, должны рассматриваться как "application / octet-stream" - другими словами, последовательность байтов, а не символов. Использование «следует» указывает, что это рекомендуемая практика, но некоторые серверы могут не следовать ей.

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

Если есть заголовок Content-Type, и он определяет набор символов, тогда вы можете декодировать в соответствии с этим набором символов. В спецификации также говорится о том, что делать с отсутствующим набором символов : для любого типа содержимого text следует предполагать, что он закодирован с использованием ISO-8859-1.

Так что это следующий шаг: если есть набор символов, или если это text тип носителя, примените декодирование.

В противном случае, оставить поток в покое.

1 голос
/ 07 мая 2011

Возможно, вы могли бы попытаться выполнить запрос HEAD , чтобы получить заголовки HTTP, прежде чем пытаться полностью обработать страницу?HTTPUrlConnection имеет setRequestMethod , где вы можете указать HEAD.

При запросе HEAD предполагается, что сервер возвращает все заголовки, но без тела сообщения.Вы можете попробовать синтаксический анализ значения заголовка Content-Type .Пример заголовков, возвращаемых с сервера:

HTTP/1.1 200 OK
Date: Mon, 23 May 2005 22:38:34 GMT
Server: Apache/1.3.3.7 (Unix)  (Red-Hat/Linux)
Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT
Etag: "3f80f-1b6-3e1cb03b"
Accept-Ranges: bytes
Content-Length: 438
Connection: close
Content-Type: text/html; charset=UTF-8

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

int i=1;// this will print all header parameter
String hKey;
while ((hKey=conn.getHeaderFieldKey(i))!=null){
    String hVal = conn.getHeaderField(i);
    System.out.println(hKey+"="+hVal);
    i++;
}
0 голосов
/ 07 мая 2011

Нет никаких гарантий, что вы можете сделать это без проверки документа.

Спецификация HTML 4.0.1 подробно описывает, как указать кодировку через HTTP-заголовок Content-Type и / или элементы meta в документе.

В случае XHTML с Content-Type: application/xhtml+xml кодировка должна быть обнаружена в документе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...