java - 在下载页面之前如何获取页面的编码?

标签 java attributes character-encoding

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

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

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

有一些类可以做到这一点或者有什么方法可以做到这一点?

最佳答案

HTTP 1.1 specification指示 Content-Type “应该”用于指示内容,并且不包含此 header 的响应应被视为“application/octet-stream”——换句话说,一个序列字节而不是字符。使用“应该”表示这是推荐的做法,但某些服务器可能不遵循它。

因此,您的第一步是查找此 header 。如果它不存在,则不要对内容应用任何字符集解码。对于 XML,假设您将流传递给解析器,这将正常工作:流将采用 UTF-8 编码,或者序言将指定编码。并且您应该始终将流直接传递到 XML 解析器,而不是先尝试将它们转换为字符串。

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

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

否则,请保留该流。

关于java - 在下载页面之前如何获取页面的编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5921941/

相关文章:

java - IO文件属性

c# - XML 序列化 - 禁用呈现数组的根元素

android - 如何在 android 文件上设置扩展用户属性?

向 mysql 插入数据时出现 PHP 字符集问题

java - Jena model.读取时间和内存问题

java - 当未选中可调整大小时,Netbeans null 布局会导致背景周围出现边框

java - Spring MVC : CharacterEncodingFilter; why only set response encoding by force?

java - 将十六进制字节数组解码为特定代码页在随后编码时会带来错误的结果

java - JTable 不显示 SQL 准备语句的 AS 部分中设置的列名

java - request.getSession 的问题