混淆xhtml5:不再是`<?xml?>`现在强制性的`meta`?

cns*_*nst 9 xhtml html5 encoding

我一直是用户的长期用户XHTML 1.0 Strict,现在我正在尝试在我的新项目中切换到XHTML5.

我很困惑<?xml version='1.0' encoding='utf-8'?>,对于HTML5,不再被认为是有效的,http://validator.w3.org/.这是为什么?这不是所有xml文档应该从什么开始?

当我删除标准<?xml...时,我的文档仍然无法验证:现在它缺少编码.我不喜欢那些meta标签,但它们现在是否有效,必须指定编码,以便有效(X)HTML5?

Juk*_*ela 8

XML声明在HTML5的XHTML序列化中有效并验证.以下相当简单的文档验证:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title></title></head>
<body></body>
</html>
Run Code Online (Sandbox Code Playgroud)

但是,这仅适用于HTML5的XHTML序列化(XHTML语法).在HTML序列化中,不允许这样做.如果您将上述文档写入文件并将其存储在将与其一起发送的服务器中Content-Type: text/html(通常在文件名以".html"结尾时发生),则会收到错误消息:

Saw <?. Probable cause: Attempt to use an XML processing instruction in HTML.
(XML processing instructions are not supported in HTML.)
Run Code Online (Sandbox Code Playgroud)

这里"HTML"仅表示HTML序列化.

浏览器不关心任何一种语法中的XML声明.在HTML语法中,它只是被忽略,作为可恢复的语法错误.在XHTML语法中,除了encoding部分之外没关系.

虽然XML 1.0规范建议(但不要求)XML声明,但实际上(encoding仅限于重要性)仅对能够处理不同版本的XML的软件很重要.浏览器不是.除了XML 1.0之外,还有XML 1.1,它使用不多.此外,还定义了HTML5,以便XHTML语法中使用的XML版本是XML 1.0.

encoding部分可能很重要,但utf-8无论如何都是XML的默认值.如果由于某种原因使用其他编码,则XML声明可能有助于防止任何冲突.HTML5 CR在其中讨论了编码:"在XHTML中,如果需要,XML声明应该用于内联字符编码信息." meta当使用XML内容类型提供时,标记在XHTML中无法真正帮助,因为编码已经在看到标签时(通过默认为UTF-8或其他方式)决定.

对于HTML语法中,<meta charset=...>标签可以被使用,但它是不需要的有效性,以及编码可在HTTP报头中指定(其覆盖任何meta标签).meta但是,使用标记可能会有所帮助,因为页面可能会在本地保存,然后在打开时不会有任何HTTP标头可用.