【发布时间】:2013-09-08 22:24:31
【问题描述】:
在纯 HTML 文档中,&pound (dec 163) 呈现为 £ 而不需要 ;,而 &oelig (dec 339) 只会呈现 – 带分号。似乎在 FireFox 和 Chrome 中,每一个十进制值低于 255 的 html 实体都无需分号即可呈现。
什么给了?
【问题讨论】:
标签: html html-entities behavior
在纯 HTML 文档中,&pound (dec 163) 呈现为 £ 而不需要 ;,而 &oelig (dec 339) 只会呈现 – 带分号。似乎在 FireFox 和 Chrome 中,每一个十进制值低于 255 的 html 实体都无需分号即可呈现。
什么给了?
【问题讨论】:
标签: html html-entities behavior
原因是从历史上看,当实体引用(或字符引用)没有紧跟名称字符时,分号是可选的。所以&pound? 可以,因为? 不是名称字符(即名称中允许的字符),但&pound4 不是,因为4 是名称字符,所以pound4 是实体名称(其中在 HTML 中未定义,但有一天可能会被定义)。此规则是 HTML 中 SGML 遗留问题的一部分,是浏览器实际应用 SGML 特性的少数几件事之一。
然而,用分号结束实体引用一直被认为是一种很好的做法。 XML 和 XHTML 甚至使它成为正式的强制要求。
这就是为什么当前的浏览器实践允许在“经典”HTML 中省略分号,但仅限于表示 ISO 拉丁 1 字符的有限字符引用集,即十进制中 Unicode 编号小于 256 的字符(十六进制中的 FF) .这是原始的实体引用集,因此此类引用已被广泛使用,无需分号。因此,这些做法是一种妥协:他们希望鼓励使用可推荐的表示法,但不要使大量旧页面无效,更不要让浏览器无法正确呈现它们。
HTML5 草案对此有不同的立场,但例如自 2013 年 8 月 6 日起的 HTML5 CR 在所有情况下都需要分号,即使在 HTML 语法中也是如此。缺少分号被定义为parse error,这意味着错误处理是明确定义的(实体应该被识别),但是浏览器仍然可能在第一次解析错误时停止解析!
【讨论】:
&pound 和 &oelig 报告为错误,但不同的是:在前一种情况下,它是引用的语法错误,在后一种情况下,引用被报告为无法识别)。
首先,这完全取决于浏览器/渲染引擎想要的宽容度,而不是 HTML 的属性:所有 实体必须以分号结尾,否则您无效句法。 (WHATWG“HTML 生活标准”混淆地认为这个分号是名称的一部分,使它看起来是可选的 in the Devloper Edition 但the full Standard text/W3C HTML5 draft 更清楚:“名称必须是一个以U+003B 分号字符 (;).")
其次,将字符称为具有“十进制值”充其量是模棱两可的。 163 和 339 是 Unicode 中这些字符的“代码点”,通常以十六进制表示。其他编码对于这些字符会有不同的位置,如果您愿意,也可以将其表示为“十进制值”。
第三,我的猜测是,这与它们在特定编码序列中的位置无关,而是它们的常见程度 - 完整列表非常长(→WHATWG/→W3C)。在解释此类无效序列时需要权衡取舍,因为 URL 可能包含未转义的 & 符号,而这些符号又看起来像未终止的实体(例如 http://example.com/foo?bar=rab&oelig=gileo)。因此,浏览器正试图走这条细线,并猜测在特定情况下可能犯了哪个错误。
【讨论】:
foo&poundbar 视为包含 £ 实体。这可能是根据 WHATWG/HTML5 标准中的规则,但我找不到这样的规则。