我正在解析很多网站。所有工作正常,我也阅读字符集声明转换编码。现在我有一个问题http://celleheute.de/sonntagsfuhrung-3/。
HTML元标记说,内容编码为ISO-8859-2,但HTTP头说,它是UTF-8。实际上,内容是UTF编码的,所以当我的解析器试图将内容转换为ISO时,它会破坏一些字符。
现在我的问题是,我应该选择哪种声明?当我可以在HTTP头中找到声明时,我应该忽略元标记吗?反之亦然?大多数网页浏览器会做什么?
要了解现代浏览器的功能,您应该从http://w3c.github.io/html/syntax.html#determining-the-character-encoding
开始阅读步骤一和步骤二与问题最相关。他们说
如果用户明确指示用户代理重写使用特定编码(可选)的文档字符编码以确定的信心返回该编码并中止这些步骤。
如果传输层指定了编码,并且支持该编码,以确定的信心返回该编码,并中止这些步骤。
这意味着真正的HTTP报头优先于除用户覆盖之外的所有内容。
除此之外,它会变得复杂。例如,字节顺序标记可以优先于元标记。
更新:自从这个答案被写出来,规范改变了(大约在2012年中期),所以字节顺序标记现在优先于HTTP标头。
这个问题根本没有答案。该页的作者由于提供了相互矛盾的信息而犯了错误。哪一个是正确的,不妨用抛硬币来决定。
一般来说,我更喜欢HTTP头作为主要值。无论如何,元标记只是作为一种退路。如果您想遵循任何逻辑,首先尝试使用HTTP报头中指定的字符集解码文档。如果这显然失败了,因为某些字节在给定的编码中是无效的,则在元标记中指定的字符集(如果有的话)中再次尝试。如果仍然失败,所有的赌注都作废了。
如果两者都失败,但编码冲突,要么涉及人工或尝试对解码文本进行一些统计分析,这可能会告诉您哪个更可能是正确的。