我是 XHTML 1.0 Strict
的长期用户,我现在正尝试在我的新项目中切换到 XHTML5。
我很困惑 <?xml version='1.0' encoding='utf-8'?>
对于 HTML5,由 http://validator.w3.org/ 不再被认为是有效的.这是为什么?这不是所有 xml 文档的开头吗?
当我删除标准 <?xml
时…,我的文档仍然无法验证:现在它缺少编码。我不喜欢那些meta
标签,但它们现在实际上是强制性的,以指定编码,以便成为有效的 (X)HTML5 吗?
最佳答案
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 ,实际上它只对能够处理不同版本的 XML 的软件很重要(除了 encoding
的重要性)。浏览器不是。而除了 XML 1.0 之外,只有 XML 1.1,用得不多。此外,HTML5 的定义使得 XHTML 语法中使用的 XML 版本为 XML 1.0。
encoding
部分可能很重要,但是 utf-8
无论如何是 XML 的默认值。如果您出于某种原因使用另一种编码,那么 XML 声明可能有助于防止任何冲突。 HTML5 CR 在其中说明了这一点 discussion of encodings :“在 XHTML 中,如有必要,应将 XML 声明用于内联字符编码信息。” meta
当与 XML 内容类型一起提供时,标记在 XHTML 中并不能真正发挥作用,因为在看到标记时编码已经确定(默认为 UTF-8 或其他)。
对于 HTML 语法,<meta charset=...>
标记可以被使用,但它不是有效性所必需的,编码可以在 HTTP header 中指定(它会覆盖任何 meta
标记)。使用 meta
然而,标记可能会有帮助,因为页面可能保存在本地,然后在打开时不会有任何可用的 HTTP header 。
关于encoding - 对 xhtml5 : no more `<?xml?>` and now mandatory `meta` ? 感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16600671/