我一直是XHTML 1.0 Strict
的长期用户,现在我正在尝试在我的新项目中切换到XHTML5。
我感到困惑的是<?xml version='1.0' encoding='utf-8'?>
对于HTML5,http://validator.w3.org/不再被视为有效。这是为什么?这不是所有xml文档应该以什么开头的吗?
当我删除标准<?xml
...时,我的文档仍然无法验证:现在它缺少编码。我不喜欢那些meta
标签,但为了有效(X)HTML5,它们现在是否是强制性的,以指定编码?
答案 0 :(得分: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>
但是,这仅适用于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.)
此处“HTML”仅表示HTML序列化。
浏览器不关心任何一种语法中的XML声明。在HTML语法中,它只是被忽略,作为可恢复的语法错误。在XHTML语法中,除encoding
部分外无关紧要。
虽然XML 1.0规范建议(但不要求)XML declaration,但实际上(除了encoding
的重要性)仅对能够处理不同版本的XML的软件很重要。浏览器不是。除了XML 1.0之外,还有XML 1.1,它使用不多。此外,还定义了HTML5,以便XHTML语法中使用的XML版本是XML 1.0。
encoding
部分可能很重要,但utf-8
无论如何都是XML的默认设置。如果由于某种原因使用其他编码,则XML声明可能有助于防止任何冲突。 HTML5 CR在其中说明discussion of encodings:“在XHTML中,如果需要,XML声明应该用于内联字符编码信息。”当使用XML内容时,meta
标记在XHTML中无法真正帮助类型,因为在看到标记时已经确定了编码(通过默认为UTF-8或其他方式)。
对于HTML语法,可以使用<meta charset=...>
标记 ,但有效性不需要它,并且可以在HTTP标头中指定编码(覆盖任何{{1} }标签)。但是,使用meta
标记可能会有所帮助,因为页面可能会在本地保存,然后在打开时不会有任何HTTP标头可用。