写`<`而不是`<`有不利之处吗

时间:2018-10-17 21:26:01

标签: html escaping special-characters

我最近了解到,在HTML中,可以省略字符实体中的分号(例如,&lt可以创建<字符,而不是&lt;)。

我发现了一些非常古老的Stack Overflow帖子,其中提到非常古老的浏览器(例如IE7)可能会遇到这种字符实体问题。但是,无论是在Web上还是仅通过测试,我都无法找到现代浏览器中此类字符实体的任何问题。

那么有什么理由不使用它们?

1 个答案:

答案 0 :(得分:3)

这完全取决于浏览器/渲染引擎的原意,并且不是HTML的属性。所有实体都必须以分号结尾,否则语法无效。 WHATWG的“ HTML Living Standard”令人困惑地认为该分号是该名称的一部分,从而使其在Developer Edition中显得是可选的。但是完整的标准文本/ W3C HTML5草案更清晰:“名称必须是以U + 003B SEMICOLON 字符(;)结尾的名称。”

从历史上看,当字符实体后没有紧随其后的名称字符时,分号是可选的。例如,&pound?将起作用是因为?不是名称字符(即名称中允许使用的字符),而&pound4则不会因为4是名称字符而使{{1 }}未定义的实体名称。此规则是SGML传统HTML的一部分,HTML是浏览器实际应用SGML特色的少数事物之一。

话虽这么说,以分号终止实体引用一直被视为一种好习惯。 XML和XHTML使其成为必需。

这就是为什么当前的浏览器惯例允许像“经典” HTML中那样省略分号,但仅用于表示ISO Latin 1字符(Unicode字符的十进制数字小于256或十六进制的FF的字符)的有限集合。这是原始的实体引用集,因此,此类引用已广泛使用而没有分号。因此,这种做法是一种折衷方案:他们希望鼓励使用指定的符号,但不要使大量不符合要求的旧页面无效并使浏览器无法正确呈现它们。

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

根据W3C Recommendation

  

在SGML中,可以消除最后的“;”在某些情况下(例如,在换行符处或紧接在标签之前)在字符引用之后。在其他情况下,它可能无法消除(例如,在单词中间)。我们强烈建议使用“;”在所有情况下均应避免出现需要使用此字符的用户代理问题。

虽然W3C Working Draft状态

  

在与符号后面必须加上第§8.5节“命名字符引用”部分中给出的名称之一,并使用相同的大小写。名称必须是以U + 003B SEMICOLON字符(;)结尾的名称。

因为分号是W3C验证所必需的,并且因为它可以在所有浏览器中使用,所以您应该使用它。不使用它们将节省的页面大小绝对微不足道,这不值得它们在所有浏览器中无法正确显示的风险。

以下是有关此主题的类似问题的两个答案: Answer 1 Answer 2