6

我正在解析很多网站。一切正常,我还在阅读字符集声明以转换编码。现在我对http://celleheute.de/sonntagsfuhrung-3/有疑问。

HTML 元标记说,内容被编码为 ISO-8859-2,但 HTTP 标头说,它是 UTF-8。实际上,内容是 UTF 编码的,所以当我的解析器尝试将内容转换为 ISO 时,它会破坏一些字符。

现在我的问题是,我应该更喜欢哪个声明?当我可以在 HTTP 标头中找到声明时,我是否应该忽略元标记,反之亦然?大多数网络浏览器会做什么?

4

2 回答 2

11

要了解现代浏览器的功能,您应该从http://w3c.github.io/html/syntax.html#determining-the-character-encoding开始阅读

第一步和第二步与问题最相关。他们说

  1. 如果用户已明确指示用户代理使用特定编码覆盖文档的字符编码,则可选择返回具有确定置信度的编码并中止这些步骤。

  2. 如果传输层指定了一种编码,并且它是受支持的,则以一定的置信度返回该编码,并中止这些步骤。

这意味着真正的 HTTP 标头优先于除用户覆盖之外的所有内容。

除此之外,它可能会变得复杂。例如,字节顺序标记可以优先于元标记。


更新:由于编写了这个答案,规范发生了变化(大约在 2012 年年中),因此字节顺序标记现在优先于 HTTP 标头。

于 2011-08-18T07:04:40.990 回答
3

对此根本没有答案。该页面的作者通过提供相互矛盾的信息犯了错误。哪一个是正确的也可以通过抛硬币来决定。

一般来说,我更喜欢 HTTP 标头作为主要值。无论如何,元标记只是作为后备。如果您想遵循任何逻辑,首先尝试使用 HTTP 标头中指定的字符集对文档进行解码。如果这明显失败,因为某些字节在给定编码中无效,请在元标记中指定的字符集中重试(如果有)。如果仍然失败,则所有赌注都将取消。

如果两者都没有失败但编码冲突,要么涉及人,要么尝试对解码的文本进行一些静态分析,这可能会告诉你哪个更有可能是正确的。

于 2011-08-18T06:08:50.250 回答