【问题标题】:Why do HTML entity names with dec < 255 not require semicolon?为什么 dec < 255 的 HTML 实体名称不需要分号?
【发布时间】:2013-09-08 22:24:31
【问题描述】:

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

什么给了?

【问题讨论】:

    标签: html html-entities behavior


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 你有拉丁语 1 特例是“当前规则”的参考吗? WHATWG 标准和 W3C HTML5 草案似乎都说分号是强制性的,正如我在回答中所引用的那样。
    • @IMSoP,很好。我已经相应地编辑了我的答案。我描述的是现代浏览器中的常见做法,是一些早期 HTML5 草案中的文本,并反映在 validator.w3.org 中(将 &amp;pound&amp;oelig 报告为错误,但不同的是:在前一种情况下,它是引用的语法错误,在后一种情况下,引用被报告为无法识别)。
    • 啊哈!这就是这些“生活”和“草案”标准的问题,我猜,你必须检查文本自上次阅读以来没有改变。这当然可以解释为什么this table 中列出了一些非分号形式,然后在elsewhere in the standard 中声明无效。供参考,解析规则are defined here in the W3C draft.
    • &pound4 在我的浏览器 (Chrome 81) 中显示为 £4
    【解决方案2】:

    首先,这完全取决于浏览器/渲染引擎想要的宽容度,而不是 HTML 的属性:所有 实体必须以分号结尾,否则您无效句法。 (WHATWG“HTML 生活标准”混淆地认为这个分号是名称的一部分,使它看起来是可选的 in the Devloper Editionthe full Standard text/W3C HTML5 draft 更清楚:“名称必须是一个以U+003B 分号字符 (;).")

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

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

    【讨论】:

    • HTML 4.01 规范在Character references 部分中说:“在 SGML 中,可以消除最后的 ";"在某些情况下,在字符引用之后(例如,在换行符处或标记之前)”。并且 HTML 4.01 规范地引用了 SGML 标准。
    • 好点。不过,浏览器比 SGML 更宽容(而且可能一直如此);例如 Firefox 将 foo&amp;poundbar 视为包含 £ 实体。这可能是根据 WHATWG/HTML5 标准中的规则,但我找不到这样的规则。
    猜你喜欢
    • 2012-11-24
    • 2021-05-19
    • 1970-01-01
    • 2017-03-20
    • 2011-12-08
    • 2010-12-15
    • 1970-01-01
    相关资源
    最近更新 更多