16

在纯 HTML 文档&pound(dec 163)中呈现为£而不需要;,而&oelig(dec 339)只会呈现带有分号的– 。在 FireFox 和 Chrome 中,似乎每个十进制值低于 255 的 html 实体都无需分号即可呈现。

是什么赋予了?

4

2 回答 2

15

原因是从历史上看,当实体引用(或字符引用)没有紧跟名称字符时,分号是可选的。可以,&pound?因为?不是名称字符(即名称中允许的字符),但&pound4不是,因为4是名称字符,pound4所以实体名称(在 HTML 中未定义,但有一天可能会被定义)。此规则是 HTML 中 SGML 遗留的一部分,是浏览器实际应用 SGML 特性的少数几件事之一。

然而,用分号结束实体引用一直被认为是一种好的做法。XML 和 XHTML 甚至使它成为正式的强制性要求。

这就是为什么当前的浏览器实践允许在“经典”HTML 中省略分号,但仅限于表示 ISO 拉丁 1 字符的有限字符引用集,即 Unicode 编号小于十进制 256(十六进制 FF)的字符。这是原始的实体引用集,因此此类引用已被广泛使用,无需分号。因此,这些做法是一种妥协:他们希望鼓励使用可推荐的表示法,但不要使大量旧页面无效,更不要让浏览器无法正确呈现它们。

HTML5 草案对此有不同的立场,但例如从 2013 年 8 月 6 日起的 HTML5 CR 在所有情况下都需要分号,即使在 HTML 语法中也是如此。缺少分号被定义为解析错误,这意味着错误处理是明确定义的(实体应被识别),但浏览器仍然可能在第一次解析错误时停止解析!

于 2013-09-09T06:22:24.833 回答
2

首先,这完全取决于浏览器/渲染引擎想要的宽容度,而不是 HTML 的属性:所有实体都必须以分号结尾,否则您的语法无效。(WHATWG“HTML 生活标准”混淆地认为这个分号是名称的一部分,使它在 Devloper 版中看起来是可选的,但完整的标准文本/ W3C HTML5 草案更清晰:“名称必须是终止的名称由 U+003B 分号字符 (;)。")

其次,将字符称为具有“十进制值”充其量是模棱两可的。163 和 339 是 Unicode 中这些字符的“代码点”,通常以十六进制表示。其他编码对于这些字符会有不同的位置,如果您愿意,也可以将其表示为“十进制值”。

第三,我的猜测是,这与它们在特定编码序列中的位置无关,而是它们的常见程度 - 完整列表非常长(→WHATWG / →W3C)。在解释此类无效序列时需要权衡取舍,因为 URL 可能包含未转义的 & 符号,而这些符号又看起来像未终止的实体(例如http://example.com/foo?bar=rab&oelig=gileo)。因此,浏览器正试图走这条细线,并猜测在特定情况下可能犯了哪个错误。

于 2013-09-08T22:52:16.040 回答