我真的需要编码'&'作为'&'?

时间:2010-08-16 13:09:49

标签: html validation html5 utf-8 character-encoding

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

http://validator.w3.org正在给我这个:

  

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

我真的需要做&amp;吗?

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

17 个答案:

答案 0 :(得分:133)

是。正如错误所说,在HTML中,属性是#PCDATA,意味着它们被解析。这意味着您可以在属性中使用字符实体。单独使用&是错误的,如果不是对于宽松的浏览器而且这是HTML而不是XHTML,则会破坏解析。只需将其作为&amp;转义即可,一切都会好的。

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

牢记这一点;如果你没有逃脱&amp;对于您创建的数据(代码很可能无效),它已经足够糟糕了,您也可能无法转义标记分隔符,这对用户提交的数据来说是一个巨大的问题,这很可能导致HTML和脚本注入,cookie窃取和其他漏洞利用。

请逃避您的代码。它将来会为你省去很多麻烦。

答案 1 :(得分:51)

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

在所有情况下,将&编码为&amp;对我来说,是一个更容易遵守的规则,可以减少错误和失败的可能性。

比较以下内容:哪个更容易?哪个更容易搞错?

方法1

  1. 写一些包含&符号的内容。
  2. 对所有人进行编码。
  3. 方法2

    (请带一粒盐;))

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

答案 2 :(得分:31)

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

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

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

答案 3 :(得分:19)

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

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

答案 4 :(得分:13)

我认为这已经变成了一个“为何在浏览器不关心时遵循规范”的问题。这是我的一般答案:

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

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

答案 5 :(得分:5)

您能告诉我们您的title究竟是什么吗?当我提交

<!DOCTYPE html>
<html>
<title>Dolce & Gabbana</title>
<body>
<p>am i allowed loose & mpersands?</p>
</body>
</html>

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

答案 6 :(得分:5)

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

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

答案 7 :(得分:4)

在HTML中,&标记了引用的开头,可以是character referenceentity reference。从那时起,解析器期望表示字符引用的#或表示实体引用的实体名称,后跟;。这是正常行为。

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

&

仅在这些情况下,可以省略结尾<p title="&amp;">foo &amp; bar</p> <p title="&amp">foo &amp bar</p> <p title="&">foo & bar</p> 或甚至引用本身(至少在HTML 4中)。我认为HTML 5需要结尾;

但是specification recommends总是使用字符引用;或实体引用&#38;之类的引用来避免混淆:

  

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

答案 8 :(得分:3)

如果用户将其传递给您,或者它将在URL中结束,则需要将其转义。

如果它出现在页面上的静态文本中?所有浏览器都会以任何一种方式得到这个,你不必担心它,因为它可以工作。

答案 9 :(得分:2)

是的,如果可能,您应尝试提供有效的代码。

大多数浏览器都会默默地纠正此错误,但依赖于浏览器中的错误处理存在问题。如何处理不正确的代码没有标准,因此每个浏览器供应商都要设法弄清楚如何处理每个错误,结果可能会有所不同。

浏览器可能会有不同反应的一些示例是,如果您将元素放在表格中但在表格单元格之外,或者将链接嵌套在彼此内部。

对于您的具体示例,它不太可能导致任何问题,但浏览器中的错误更正可能会导致浏览器从符合标准的模式更改为怪异模式,这可能会使您的布局完全崩溃。

所以,你应该在代码中纠正这样的错误,如果不是其他任何错误,那么为了保证验证器中的错误列表简短,这样你就可以发现更严重的问题。

答案 10 :(得分:2)

几年前,我们收到一份报告称我们的某个网络应用在Firefox中无法正常显示。事实证明该页面包含一个看起来像

的标签
<div style="..." ... style="...">

当面对重复的样式属性时,IE结合了两种样式,而Firefox只使用其中一种,因此行为不同。我将标签更改为

<div style="...; ..." ...>

果然,它解决了这个问题!故事的寓意是浏览器对有效HTML的处理比对无效HTML的处理更加一致。所以,修复你该死的标记! (或者使用HTML Tidy来修复它。)

答案 11 :(得分:2)

我正在检查为什么Image URL需要转义,因此在https://validator.w3.org中尝试了它。解释非常好。它强调甚至URL都需要转义。 [PS:我猜它会因为URL需要&而被消耗掉。任何人都可以澄清吗?]

<img alt="" src="foo?bar=qut&qux=fop" />
  

在文档中找到了实体引用,但没有   由该名称定义的引用。这通常是由拼写错误造成的   参考名称,未编码的&符号,或通过离开   尾随分号(;)。导致此错误的最常见原因是   URL中未编码的&符号,如WDG“Ampersands in   URL“。实体引用以&符号(&amp;)开头,以a结尾   分号(;)。如果要在文档中使用文字&符号   你必须把它编码为“&amp;” (甚至在URL内!)。小心结束   带分号的实体引用或您的实体引用可能会获得   结合以下文字解释。还要记住   命名实体引用区分大小写; &安培; Aelig;和æ   是不同的人物。如果在某些标记中出现此错误   由PHP的会话处理代码生成,本文有   解决问题的方法和解决方案。

答案 12 :(得分:1)

如果 html 中使用&,那么您应该将其转义

如果在javascript字符串中使用&,例如您不需要使用alert('This & that');或document.href。

如果您正在使用document.write,那么您应该使用它,例如document.write(<p>this &amp; that</p>)

答案 13 :(得分:1)

这取决于分号在&附近结束的可能性,导致它显示完全不同的内容。

例如,在处理来自用户的输入时(例如,如果您在标题标签中包含用户提供的论坛帖子的主题),您永远不知道他们可能在哪里放置随机分号,并且它可能会随机显示奇怪的实体。所以总是逃避那种情况。

对于你自己的静态html,当然可以跳过它,但包含正确的转义是如此微不足道,没有充分的理由可以避免它。

答案 14 :(得分:0)

如果你真的在谈论静态文本

<title>Foo & Bar</title>

存储在硬盘上的某个文件中并由服务器直接提供,然后是:它可能不需要转义。

但是,由于现在非常很少的HTML内容完全是静态的,我将添加以下免责声明,假设HTML内容是从其他来源生成的(数据库内容,用户输入, Web服务调用结果,遗留API结果,...):

如果您没有逃避简单的&,那么您也可能无法逃避&amp;&nbsp;<b>或{{1}或任何其他无效文本。这意味着您最多会错误地显示您的内容,而XSS attacks更容易被怀疑。

换句话说:当你已经检查并逃避其他更有问题的案件时,那么几乎没有理由留下那些没有完全破碎但仍然有点腥的独立 - 并且未逸出。

答案 15 :(得分:-1)

不确定这对任何人都有用......我正在争吵一段时间......这是一个光荣的正则表达式,你可以用它来修复你的所有链接,javascript,内容。我不得不处理大量遗留内容,没有人愿意纠正。

将其添加到母版页或控件中的渲染覆盖:

请不要因为把它放在错误的地方而激怒我:

// remove the & from href="blaw?a=b&b=c" and replace with &amp; 
//in urls - this corrects any unencoded & not just those in URL's
// this match will also ignore any matches it finds within <script> blocks AND
// it will also ignore the matches where the link includes a javascript command like
// <a href="javascript:alert{'& & &'}">blaw</a>
html = Regex.Replace(html, "&(?!(?<=(?<outerquote>[\"'])javascript:(?>(?!\\k<outerquote>|[>]).)*)\\k<outerquote>?)(?!(?:[a-zA-Z][a-zA-Z0-9]*|#\\d+);)(?!(?>(?:(?!<script|\\/script>).)*)\\/script>)", "&amp;", RegexOptions.Singleline | RegexOptions.IgnoreCase);

答案 16 :(得分:-1)

该链接提供了一个很好的示例,说明您何时以及为何需要将&转移到&amp;

https://jsfiddle.net/vh2h7usk/1/

有趣的是,为了在我的答案中正确地表达它,我不得不逃避角色。如果我要使用内置的代码示例选项(来自答案面板),我只需输入&amp;就可以了。但是,如果我要手动使用<code></code>元素,那么我必须转义才能正确表示它:)