我正在解析很多网站。一切正常,我正在读取转换编码的字符集声明。现在我遇到了http://celleheute.de/sonntagsfuhrung-3/的问题。
HTML元标记说,内容编码为ISO-8859-2,但HTTP标头说,它是UTF-8。实际上,内容是UTF编码的,所以当我的解析器尝试将内容转换为ISO时,它会破坏一些字符。
现在我的问题是,我更喜欢哪种声明?我可以忽略元标记,当我可以在HTTP标头中找到声明,反之亦然?大多数网络浏览器会做什么?
答案 0 :(得分:11)
要了解现代浏览器的功能,您应该开始阅读http://w3c.github.io/html/syntax.html#determining-the-character-encoding
第一步和第二步与问题最相关。他们说
如果用户已明确指示用户代理覆盖 可选的,具有特定编码的文档的字符编码 返回具有置信度的编码并中止这些编码 步骤。
- 醇>
如果传输层指定了编码,并且支持, 以确定的置信度返回该编码,并中止这些 步骤。
这意味着真正的HTTP标头优先于除用户覆盖之外的所有内容。
除此之外它可能变得复杂。例如,字节顺序标记可以优先于元标记。
更新:由于编写了这个答案,规范发生了变化(大约在2012年中期),因此字节顺序标记现在优先于HTTP标头。
答案 1 :(得分:3)
根本没有答案。该页面的作者通过提供有冲突的信息来提交错误。哪一个是正确的也可以通过抛硬币决定。
通常,我更喜欢HTTP标头作为主要值。无论如何,元标记只是一个后备。如果您想要遵循任何逻辑,首先尝试使用HTTP标头中指定的字符集解码文档。如果这显然失败,因为某些字节在给定编码中无效,请再次尝试在元标记中指定的字符集中(如果有)。如果仍然失败,所有投注都将被取消。
如果两种方法都没有失败但是编码冲突,要么是涉及人类,要么对解码后的文本进行一些静态分析,这可能会告诉你哪些更可能是正确的。