在下载之前我如何获得页面的编码?

时间:2011-05-07 15:16:32

标签: java attributes character-encoding

我需要在下载之前获取网页的编码(UTF-8,ISO-8859-1等),因为我会使用编码将其从InputStream下载到String。

我使用HttpUrlConnection并且有一个名为getContentEncoding的方法,但只有在服务器发送它时它才会返回。

在某些情况下,编码在属性字符集(HTML4?)中,在其他属性编码(XHTML)中,以及其他我不知道的,但我认为还有其他形式。

有些课程可以做到这一点或者做什么?

3 个答案:

答案 0 :(得分:1)

在尝试完全处理页面之前,您可以尝试发出HEAD request来获取HTTP标头吗? HTTPUrlConnection有setRequestMethod,您可以在其中指定HEAD。

使用HEAD请求,服务器应该返回所有标头但没有消息体。您可以尝试parsing the Content-Type header value。从服务器返回的示例标头是:

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++;
}

答案 1 :(得分:1)

HTTP 1.1 specification表示Content-Type“应该”用于表示内容,而不包含此标题的响应应该被视为“application / octet-stream” - 在其他单词,字节序列而不是字符。 “should”的使用表明它是推荐的做法,但有些服务器可能不遵循它。

所以,你的第一步是寻找这个标题。如果它不存在,请不要对内容应用任何字符集解码。对于XML,假设您将流传递给解析器,这将起作用:流将是UTF-8编码,或者序言将指定编码。并且始终将流直接传递给XML解析器,而不是先尝试将它们转换为字符串。

如果有一个Content-Type标题,并且它指定了一个字符集,那么您可以根据该字符集自由解码。该规范还讨论了如何处理missing character set:对于任何text内容类型,您应该假设它使用ISO-8859-1进行编码。

这就是下一步:如果有字符集,或者它是text媒体类型,请应用解码。

否则,请单独留下流。

答案 2 :(得分:0)

无法保证在不检查文档的情况下执行此操作。

HTML 4.0.1 spec详细说明了如何通过文档中的Content-Type HTTP标头和/或meta元素指定编码。

如果XHTML与Content-Type: application/xhtml+xml一起提供,则必须从文档中发现编码。