问题 为什么这个HTML5文档无效?


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

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

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

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

关于此错误,我有两件事我不明白:

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

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


11154
2017-07-29 23:16


起源

是什么让你认为当没有指定编码时浏览器采用UTF-8?您指的是什么“后备规则”? - Andrew Marshall
Windows-1252编码有效吗? - pattyd
有意思......当我通过直接输入窗口将其粘贴到验证中时,显示的html示例验证为html5 / utf8 - WebChemist
值得一读: 绝对最低每个软件开发人员绝对必须知道Unicode和字符集(没有借口!) (备用标题:没有明文这样的东西) - doppelgreener
@KathBrown我发现你很有意思 知道 因为它不是真的。最新版本的Chrome(28)和Firefox(22)都没有UTF-8(默认情况下它们都使用ISO-8859-1)。 Firefox甚至在控制台中发出关于非ASCII字符的警告。没有指定编码时,除了回退之外没有回退规则。你的假设都是错的。 - Andrew Marshall


答案:


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

  • 如果你正在使用 上传文件 选项,取决于哪个 编码HTML文件已保存。
  • 如果你正在使用 直接输入 选项,这取决于 航海家。

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

<meta charset="UTF-8">

在里面 头元素


7
2017-07-29 23:35



直接输入模式不依赖于导航器。从验证页面:“与”按URI“和”按文件上传“模式不同,验证器的”直接输入“模式以验证者表单字段中粘贴或输入的字符形式提供验证内容。这将自动生成数据UTF-8,因此验证器不需要确定文档的字符编码,并将忽略指定的任何字符集信息。“ - Andy G


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

维基百科

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


5
2017-07-29 23:29





W3C验证员说:

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

所以用一小撮盐取一些结果。

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

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


2
2017-07-29 23:35



OP所指的“直接输入”模式将“自动使数据UTF-8”和“忽略任何字符集信息”。看我对坎帕里的评论。 - Andy G
有道理。虽然它没有严格“忽略任何字符集信息”,因为它改变了提供的元字符集,如果它不是utf-8(并将用户提供的字符集放在HTML注释代码中) - James


当您使用Validate by URI时,服务器应该在HTTP标头中宣布字符编码,更确切地说是在 charset 的参数 Content-Type 标头值。在这种情况下,这显然不会发生。您可以查看情况,例如运用 Rex Swain的HTTP查看器

根据条款 4.2.5.5指定文档的字符编码 在HTML5 CR中,“如果HTML文档不是以BOM开头,并且其内容类型元数据未明确给出其编码,并且该文档不是iframe srcdoc文档,则使用的字符编码必须是ASCII兼容的字符编码,必须使用带有charset属性的meta元素或在Encoding声明状态中带有http-equiv属性的元素来指定编码。“这有点复杂,但底线是:有几种方法声明编码,但如果没有使用它们,则文档不符合要求。

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

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

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


1
2017-07-30 08:39