在纯HTML文档中£
(dec 163)呈现为£而不需要;
,而&oelig
(12月33日)只会呈现分号 - 。似乎每个html实体的小数值都小于255,在FireFox和Chrome中都不需要分号就可以呈现。
是什么给出的?
答案 0 :(得分:12)
原因是历史上,当实体引用(或字符引用)后面没有名称字符后,分号是可选的。所以£?
是正常的,因为?
不是名称字符(即名称中允许的字符),但£4
不是,因为4
是名称字符,因此pound4
实体名称(在HTML中未定义,但可能有一天会被定义)。此规则是HTML中SGML遗留问题的一部分,是浏览器实际应用SGML专业的少数几项内容之一。
然而,通过分号终止实体引用始终被视为良好做法。 XML,甚至XHTML,甚至使它成为正式的强制性。
这就是为什么当前的浏览器实践允许省略分号,如“经典”HTML,但仅限于表示ISO Latin 1字符的有限字符引用集,即十进制中Unicode数小于256的字符(十六进制FF) 。这是实体引用的原始集合,因此这些引用已被广泛使用而没有分号。因此,这些做法是一种妥协:他们希望鼓励使用可推荐的符号,但不要使大量旧页面无效,更不用说让浏览器无法正确呈现它们。
HTML5草案在此方面有不同的立场,但是2013年8月6日起的HTML5 CR在所有情况下都需要使用分号,即使是HTML语法也是如此。缺少分号被定义为parse error,这意味着错误处理是明确定义的(实体应该被识别),但浏览器可能仍然在第一次解析错误时停止解析!
答案 1 :(得分:2)
首先,这完全取决于浏览器/呈现引擎的原因,并不是HTML的属性:所有实体必须以分号结尾,否则您将无效句法。 (WHATWG" HTML Living Standard"混淆地认为这个分号是名称的一部分,使其看起来是可选的in the Devloper Edition,但the full Standard text / W3C HTML5 draft更清晰: "名称必须是由U + 003B SEMICOLON字符(;)终止的名称。")
其次,将字符称为具有"十进制值"充其量是暧昧的。 163和339是"代码点" Unicode中的那些字符,通常用十六进制表示。其他编码对于这些字符具有不同的位置,也可以表示为"十进制值"如果你想要的话。
第三,我的猜测是,它与特定编码序列中的位置并没有多大关系,但它们有多常见 - 完整列表非常长(→WHATWG / →W3C )。在解释这样的无效序列时需要进行权衡,因为URL可能包含未转义的&符号,而后者又看起来像未终止的实体(例如http://example.com/foo?bar=rab&oelig=gileo
)。所以浏览器试图踩到那条细线并猜测在特定情况下可能犯了哪个错误。