9

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

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

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

4

1 回答 1

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 声明,但实际上(除了 的意义之外encoding)它只对能够处理不同版本的 XML 的软件起作用。浏览器不是。而且除了 XML 1.0 之外,只有 XML 1.1,用的不多。此外,HTML5 被定义为在 XHTML 语法中使用的 XML 版本是 XML 1.0。

encoding部分可能很重要,但utf-8无论如何都是 XML 的默认值。如果出于某种原因使用另一种编码,则 XML 声明可能有助于防止任何冲突。HTML5 CR 在其关于编码的讨论中这样说:“在 XHTML 中,如有必要,应将 XML 声明用于内联字符编码信息。” 当使用 XML 内容类型提供meta标记时,标记在 XHTML 中并不能真正提供帮助,因为在看到标记时已经确定了编码(默认为 UTF-8 或其他方式)。

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

于 2013-05-17T05:02:37.780 回答