为什么这个HTML5文档无效?

时间:2013-07-29 23:16:57

标签: html

当我尝试验证任何没有像这样的元编码的简单HTML文档时,我对我收到的错误消息感到非常困惑:

<!DOCTYPE html>
<html>
<head>
<title>Test</title>
</head>
<body>Test</body>
</html>

W3C验证程序http://validator.w3.org在将文档粘贴到直接输入表单时,不情愿地接受该文档只有几个警告,但是当通过URI上载或加载文档时,验证失败并显示此错误消息< / p>

  

未声明字符编码。继续使用   窗口1252。

我对这个错误有两点不明白:

  • 当存在回退规则时,为什么缺少字符编码会被视为错误?
  • 为什么验证器假定使用windows-1252而不是UTF-8,就像任何浏览器一样?

有人可以解释这两点吗?我对这些东西很新,所以请耐心等待。

4 个答案:

答案 0 :(得分:10)

嗯,这取决于你使用的是什么。

  • 如果您使用File Upload选项,则取决于哪个 编码HTML文件已保存为。
  • 如果您使用Direct Input选项,则取决于 导航仪。

如果您不想让验证器猜测,并使用UTF-8,您可以添加以下行

<meta charset="UTF-8">

head element内。

答案 1 :(得分:5)

验证器的“直接输入”模式默认为UTF-8。用户代理(浏览器)将根据许多内容默认使用其他编码:

wikipedia

  

如果用户代理读取没有字符编码的文档   信息,它可以回退到使用其他一些信息。对于   例如,它可以依赖于用户的设置,无论是浏览器范围还是   特定于给定文档,或者它可以选择基于默认编码   用户的语言。对于西欧语言来说,这是典型的   并且相当安全地假设Windows-1252,类似于ISO-8859-1   但是有可打印的字符代替一些控制代码。

答案 2 :(得分:2)

W3C验证员说:

  

验证员使用实验性功能检查了您的文档:HTML5一致性检查器。此功能是为了您的方便而提供的,但请注意,它可能不可靠,或者与最新的一些尖端技术的最新发展不完全一致。

所以用一点盐来取一些结果。

此外,没有有用的“后退”,验证器只需要选择一些东西,以便它可以尝试为您验证。 W3C无法确定/决定您想要/需要使用的编码。您必须根据您需要在网页上提供的字符自行声明,然后要求W3C根据该文档验证您的文档。

您使用什么编辑器/ WYSIWYG来制作网页? 我们可以提供您要验证的网址吗?

答案 3 :(得分:1)

当您使用按URI验证时,服务器应该在HTTP标头中公布字符编码,更准确地说是在charset标头值的Content-Type参数中。在这种情况下,这显然不会发生。你可以检查一下情况,例如使用Rex Swain's HTTP Viewer

根据HTML5 CR中的条款4.2.5.5 Specifying the document's character encoding,“如果HTML文档不是以BOM开头,并且Content-Type元数据未明确给出其编码,并且该文档不是iframe srcdoc文档,然后使用的字符编码必须是ASCII兼容的字符编码,并且必须使用带有charset属性的元元素或在Encoding声明状态中具有http-equiv属性的元素来指定编码。“这有点复杂但最重要的是:有几种方法可以声明编码,但是如果没有使用它们,那么文档是不符合的。

为什么它指定所以有点推测,但一般的想法是这样的规则提高了可靠性和稳健性。如果不遵守规则,不同的浏览器可能会使用不同的默认值或猜测。

验证器假设使用windows-1252,因为HTML5规则导致了这一点。处理规则位于8.2.2.1 Determining the character encoding。它们相当复杂,但它们在很大程度上反映了现代浏览器的做法(并旨在使其成为标准)。那里的规则也是为了处理不合格的文件,但这并不能使这些文件符合要求;错误处理规则并不是真正的“后备”,不应该依赖它,特别是因为旧浏览器并不总是遵守规则。

当涉及到其他所有方法都失败并且要使用“实现定义或用户指定的默认字符编码”的情况时,错误规则会稍微松散。关于浏览器可能做什么只是“建议”(再次反映现代浏览器通常做的事情),这可能涉及使用“用户的语言环境”,这是一个模糊的概念。然后验证器使用windows-1252,也许是因为这是英语的默认值,验证器“说”英语,或者可能只是因为猜测的猜测比任何其他单一选择更频繁。