我真的需要将'&'编码为'&'吗?

Har*_*ldo 194 html validation html5 utf-8 character-encoding

&在我的网站上使用带有HTML5和UTF-8的符号<title>.Google在其SERP上显示的&符号很好,其标题中的所有浏览器也是如此.

http://validator.w3.org给了我这个:

并没有开始角色参考.(可能应该被转义为&amp;.)

我真的需要做&amp;吗?

我并不是为了验证我的页面而感到困惑,但是我很想听听人们对此的看法,以及它是否重要以及为什么.

Del*_*ani 136

是.正如错误所说,在HTML中,属性是#PCDATA,意味着它们被解析.这意味着您可以在属性中使用字符实体.单独使用&是错误的,如果不是对于宽松的浏览器而且这是HTML而不是XHTML这一事实会破坏解析.只是逃避它&amp;,一切都会好起来的.

HTML5允许您将其保留为非转义状态,但仅限于后面的数据看起来不像有效的字符引用.但是,最好只是逃避这个符号的所有实例而不是担心哪些应该是哪些以及哪些不需要.

记住这一点; 如果你没有转义和转发,那么你创建的数据(代码很可能无效)就足够了,你也可能无法转义标记分隔符,这对于用户提交的数据来说是个大问题,这很可能导致HTML和脚本注入,cookie窃取和其他漏洞利用.

请逃避你的代码.它将在未来为您节省很多麻烦.

  • 是.但从道德上讲,我们应该依赖于浏览器的宽大和"好"错误处理吗?或者我们应该编写正确的代码? (45认同)
  • 每个人似乎都在谈论HTML5,但最初的问题表明HTML5正在使用中.HTML5明确允许未转义的&在这种情况下,除非后面和通常会扩展到实体(例如&copy = 2有问题,但&x = 2很好). (10认同)
  • 任何浏览器都不会"错误地"解释a&by.每个现有浏览器都将其显示为"&".考虑到他明确要求做到这一点的实际理由,并表示他不关心验证. (9认同)
  • @Delan:当我试图让我写的每一页都有效时,我从阅读他的问题中理解他并不关心"道德".他只关心它是否有效.它们是两种不同的哲学,都有其优点和缺点,并没有"正确"的理念.例如,这个网站没有验证,但它是一个很棒的网站. (7认同)
  • @Andreas,但是浏览器在解释正确的代码方面有足够的错误,这取决于它们在发送它们时获得正确的结果无意义的标记是真实的.它可能在今天使用该示例,然后在下一个示例中失败(假设下一个示例在&之后的某处有一个分号) (3认同)

Ric*_*uen 52

除了验证之外,事实仍然是编码某些字符对于HTML文档很重要,因此它可以作为网页正确,安全地呈现.

编码&&amp;在任何情况下,对我来说,是生活的,减少错误和失败的可能性更简单的规则.

比较以下内容:哪个更容易?哪个更容易开玩笑

方法论1

  1. 写一些包含&符号的内容.
  2. 对它们进行编码.

方法2

(请带一粒盐;))

  1. 写一些包含&符号的内容.
  2. 根据具体情况,查看每个&符号.确定是否:
    • 它是孤立的,因此毫不含糊地是一个&符号.例如.volt & amp
       >在这种情况下,不要打扰它编码.
    • 它不是孤立的,但你觉得它是明确的,因为生成的实体不存在并且永远不会存在,因为实体列表永远不会发展.例如amp&volt
       >在这种情况下,不要打扰它编码.
    • 它不是孤立的,含糊不清的.例如.volt&amp
       >编码.

??

  • @Gumbo"amp&volt"中的&符号不是一个模糊的&符号(根据HTML规范中的定义).请参阅http://mathiasbynens.be/notes/ambiguous-ampersands和http://mothereff.in/ampersands#amp%26volt. (6认同)
  • 'amp&volt`*的第二种情况是*不明确的:`&volt`现在是否是实体引用? (3认同)

Mat*_*ens 31

我对此进行了彻底研究,并在此处写了我的发现:http://mathiasbynens.be/notes/ambiguous-ampersands

我还创建了一个在线工具,您可以使用它来检查您的标记是否有歧义的符号或不以分号结尾的字符引用,这两个都是无效的.(目前没有HTML验证程序正确执行此操作.)

http://i.imgur.com/cLssU.png

  • @MathiasBynens +1感谢您的博文和此工具.你真的超越了.这里真正的结论是你可以正式编写明文`&`,只要它不像*属性表达式.这对我来说真的很清楚.亲身.HTML5规范不遗余力地使HTML易于编写,将解释的困难工作推向浏览器,在我看来这是一个很好的方法.严格的语法XHTML的日子已经一去不复返了,这是一件好事. (2认同)

Mat*_*son 19

HTML5规则与HTML4不同.HTML5中不需要它 - 除非&符号看起来像是启动参数名称."© = 2"仍然是一个问题,例如,因为© 是版权符号.

然而,在我看来,根据以下文本决定编码或不编码是更难的工作.所以最简单的路径可能就是一直编码.

  • `&copy = 2`并不像你想象的那么大.在属性值(例如`href`属性)中,`&copy`不会被视为`©`的字符引用.在属性值之外,它会. (3认同)
  • 这就像引用属性值 - 你没有必要,但如果你一直这样做,你就不会出错. (2认同)

Rya*_*nal 14

我认为这更像是一个"当浏览器不在乎时为什么遵循规范"的问题.这是我的一般答案:

标准不是"现在"的东西.它们是"未来"的东西.如果我们作为开发人员遵循Web标准,那么浏览器供应商更有可能正确地实现这些标准,并且我们更接近完全可互操作的Web,其中不需要CSS攻击,特征检测和浏览器检测.我们不必弄清楚为什么我们的布局在特定浏览器中中断,或者如何解决这个问题.

具体来说,如果HTML5不需要使用& 在您的特定情况下,您正在使用HTML5文档类型(并期望您的用户使用符合HTML5的浏览器),那么没有理由这样做.

  • 话虽如此,一般来说,您必须记住,大多数“标准”方式仍处于草稿模式,并且将来可能会发生变化。 (2认同)

Gum*_*mbo 6

在 HTML 中,a&标记引用的开始,无论是字符引用还是实体引用。从那时起,解析器需要一个#表示字符引用的实体名称,或者表示实体引用的实体名称,两者后跟一个;. 这是正常的行为。

但是,如果引用名称或仅引用开头&后跟一个空格或其他分隔符,如", ', <, >, &,则结尾;甚至表示普通的引用&都可以省略:

<p title="&amp;">foo &amp; bar</p>
<p title="&amp">foo &amp bar</p>
<p title="&">foo & bar</p>
Run Code Online (Sandbox Code Playgroud)

只有在这些情况下,结尾;甚至引用本身才能被省略(至少在 HTML 4 中)。我认为 HTML 5 需要结尾;.

但是规范建议始终使用像字符引用&#38;或实体引用这样的引用&amp;以避免混淆:

作者应该使用“ &amp;”(ASCII 十进制 38)而不是“ &”,以避免与字符引用的开头(实体引用开放分隔符)混淆。作者还应该&amp;在属性值中使用“ ”,因为在 CDATA 属性值中允许字符引用。


Nis*_*ant 6

更新(2020 年 3 月): W3C 验证器不再抱怨转义 URL。

\n

我正在检查为什么图像URL 需要转义,因此在https://validator.w3.org中进行了尝试。这个解释非常好。它强调甚至 URL 也需要转义。[PS:我猜它在使用时不会被转义,因为 URL 需要&. 谁能解释一下吗?]

\n
<img alt="" src="foo?bar=qut&qux=fop" />\n
Run Code Online (Sandbox Code Playgroud)\n
\n

在文档中找到实体引用,但\n没有定义该名称的引用。这通常是由于引用名称拼写错误、未编码的 & 符号或遗漏尾部分号 (;) 造成的。导致此错误的最常见原因是 URL 中的 & 符号\n未编码,如 WDG 在“URL 中的 & 符号”中所述。实体引用以与号 (&) 开头,并以分号 (;) 结尾。如果您想在文档中使用文字与符号\n您必须将其编码为“&”(即使在 URL 内!)。请小心以分号结束实体引用,否则您的实体引用可能会与以下文本相关联而被解释。另请记住\n命名实体引用区分大小写;&Aelig; 和 \xc3\xa6\n 是不同的字符。如果此错误出现在由 PHP 会话处理代码生成的某些标记中,本文提供了针对您的问题的解释和解决方案。

\n
\n


Tho*_*ini 5

好吧,如果它来自用户输入,那么绝对是的,原因很明显.想想这个网站是不是这样做了:这个问题的标题会出现,我真的需要将'&'编码为'&'吗?

如果它只是像echo '<title>Dolce & Gabbana</title>';严格说来你不必要的东西.它会更好,但如果你不这样做,用户就不会注意到差异.


Aak*_*shM 5

你能告诉我们你的title实际情况吗?当我提交

<!DOCTYPE html>
<html>
<title>Dolce & Gabbana</title>
<body>
<p>am i allowed loose & mpersands?</p>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

http://validator.w3.org/ - 明确要求它使用实验性HTML 5模式 - 它没有关于&s ...的抱怨

  • 是的,HTML5 的解析器与以前的 HTML 和 XHTML 解析器不同,并且在某些情况下允许使用未转义的&符号。 (2认同)