2013-07-29 80 views
10

我越来越漂亮困惑我收到一条错误消息时我尝试验证任何简单的HTML文档,而不元编码是这样的:为什么这个HTML5文档无效?

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

W3C验证http://validator.w3.org勉强地接受与为有效文档只是当它被粘贴到直接输入的形式,但在对文档进行上传或通过URI加载的一些警告,验证失败,此错误消息

The character encoding was not declared. Proceeding using windows-1252.

有两件事情我不明白这个错误:

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

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

+3

当没有指定编码时,您认为浏览器采用UTF-8的原因是什么?你指的是什么“后备规则”? –

+0

虽然windows-1252编码工作吗? – pattyd

+0

有意思的是,当我通过直接输入窗口将其粘贴到验证中时,显示的html示例验证为html5/utf8 – WebChemist

回答

5

它是验证器默认为UTF-8的“直接输入”模式。用户代理(浏览器)将默认为其他编码的基础上的一些事情:

wikipedia

If a user agent reads a document with no character encoding information, it can fall back to using some other information. For example, it can rely on the user's settings, either browser-wide or specific for a given document, or it can pick a default encoding based on the user's language. For Western European languages, it is typical and fairly safe to assume Windows-1252, which is similar to ISO-8859-1 but has printable characters in place of some control codes.

2

W3C验证说:

The validator checked your document with an experimental feature: HTML5 Conformance Checker. This feature has been made available for your convenience, but be aware that it may be unreliable, or not perfectly up to date with the latest development of some cutting-edge technologies.

所以需要一些结果与少许盐。

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

你用什么编辑器/所见即所得来制作网页? 我们可以有你想要验证的网址吗?

+0

OP所指的“直接输入”模式将“自动生成数据UTF-8”和“忽略任何字符集信息”。看到我对Campari的评论。 –

+0

公平点。尽管它不会严格地“忽略任何字符集信息”,因为它改变了如果不是utf-8提供的元字符集(并且将用户提供的字符集放在HTML注释代码中) – James

6

嗯,这取决于你在用什么。

  • 如果您使用的是File Upload选项,这取决于其 编码的HTML文件被保存。
  • 如果您使用的是Direct Input选项,则取决于导航器的 。

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

<meta charset="UTF-8"> 

的的head element内。

+0

直接输入模式不依赖于导航器。从验证页面:“不同于”通过URI“和”通过文件上传“模式,验证器的”直接输入“模式提供已验证内容的字符形式粘贴或键入验证器的表单字段。数据UTF-8,因此验证程序不需要确定文档的字符编码,并且会忽略指定的任何字符集信息。“ –

1

当您使用通过URI验证时,服务器应该宣布HTTP标头中的字符编码,更确切地说是Content-Type标头值的charset参数。在这种情况下,这显然不会发生。您可以检查情况使用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属性的meta元素或具有编码声明状态中的http-equiv属性的元元素来指定。“这有点复杂,但底线是:有几种方法可以声明编码,但如果没有使用这些编码,则文档不符合要求。

为什么它指定所以有些投机,但总的想法是,这些规则促进可靠性和稳健性。当规则不被遵守时,不同的浏览器可能会使用不同的默认值或猜测。

验证器会采用windows-1252,因为这是HTML5规则导致的结果。处理规则在8.2.2.1 Determining the character encoding。它们相当复杂,但它们在很大程度上反映了现代浏览器的工作方式(并且旨在使其成为标准)。这里的规则也是为了处理不符合要求的文件,但这并不能使这些文件保持一致;错误处理规则并不是真正的“后备”,不应该依赖,尤其是因为旧的浏览器并不总是按照规则来玩。

当涉及到一切都失败并且要使用“实现定义的或用户指定的缺省字符编码”的情况时,错误规则会有些松散。对于浏览器可能会做什么只是“建议”(再次反映了现代浏览器通常会做的事情),这可能涉及使用“用户区域设置”这个晦涩的概念。然后,验证器使用windows-1252,可能是因为这是默认的英语和验证器“说”英语,或者可能只是因为这是猜测比其他任何单一替代方案更经常。