我需要在下载之前获取网页的编码(UTF-8,ISO-8859-1等),因为我会使用编码将其从InputStream下载到String。
我使用HttpUrlConnection并且有一个名为getContentEncoding的方法,但只有在服务器发送它时它才会返回。
在某些情况下,编码在属性字符集(HTML4?)中,在其他属性编码(XHTML)中,以及其他我不知道的,但我认为还有其他形式。
有些课程可以做到这一点或者做什么?
答案 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
一起提供,则必须从文档中发现编码。