浏览器如何处理指定字符编码的<meta>标签?

5
假设浏览器遇到了一个指定字符编码的标签,像这样:<meta>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />

它是否会从头开始解析页面,因为在部分中的一些前面的字符可能被错误地解释了?还是有其他限制,防止先前的字符被错误地解释?
3个回答

4
据我所知,一旦浏览器在中找到charset声明,它们就不会返回并且假定到该点为止是ASCII兼容的字符集。不幸的是我找不到参考资料来证实这一点。
如果服务器已经提供了Content-Type HTTP头,则确认浏览器将忽略Content-Type元素,因此您无法通过元素覆盖“错误”的服务器端字符集。 字符集声明的重点是HTML文档,这些文档不是由HTTP服务器提供的。
这意味着您不应依赖于HTML文件中的字符集声明,而是应配置您的HTTP服务器以提供正确的字符集。如果出于某种原因您必须依赖于字符集声明,则应该仅有ASCII字符直到那一点,并尽可能早地将其放置在中,最好作为第一个元素。

1
谢谢。我找到了一个关于“假定到那个点为止是ASCII兼容字符集”的参考资料。它在(惊喜!)W3C上:http://www.w3.org/TR/html4/charset.html#h-5.2.2。如果需要,这是有关标签放置的好建议。 - Joel Lee

1

解析器在某些情况下可以重新开始。相关规范在这里:http://dev.w3.org/html5/spec/parsing.html#change-the-encoding

请注意,浏览器传统上可能没有完全遵循此算法;它们很可能做了略微不同的事情。然而,上面的链接描述了符合HTML5的浏览器应该做什么。所描述的算法很可能是各种浏览器以前行为的综合体。

由于HTML5仍然是一个工作草案,因此应考虑其可能会发生变化。


@Joel - HTML5 中算法的标准化是新的。 - Alohci

0

它对节点结构没有实际影响。只有文本节点(和属性节点)的内容需要进行转码。

如果您的服务器发送了

Content-type: text/html;charset=utf-8

...通过在头部设置字符集,浏览器可以从一开始就知道正确的字符集。您可以通过包含以下内容的.htaccess文件来实现:

AddDefaultCharset utf-8

但是可能发生的情况是元标记指定的字符集与“Content-type”标头中的字符集不同,否则似乎没有使用元标记的任何意义。虽然不必重新解析文档节点,但是您仍然可能在<head>部分的前面部分中出现错误(例如,在某些JavaScript中的字符串值)。 - Joel Lee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接