我在我的网站的<title>中使用了HTML5和UTF-8的“&”符号。谷歌在其serp上显示与号fine,所有浏览器在其标题中也是如此。
http://validator.w3.org给了我这个:
&没有开始字符引用。(&可能应该被转义为&。)
我真的需要做&
我并不在意我的页面为了验证而验证,但我很好奇人们对这个问题的看法,以及它是否重要以及为什么重要。
我在我的网站的<title>中使用了HTML5和UTF-8的“&”符号。谷歌在其serp上显示与号fine,所有浏览器在其标题中也是如此。
http://validator.w3.org给了我这个:
&没有开始字符引用。(&可能应该被转义为&。)
我真的需要做&
我并不在意我的页面为了验证而验证,但我很好奇人们对这个问题的看法,以及它是否重要以及为什么重要。
当前回答
在HTML中,&标记引用的开始,无论是字符引用还是实体引用。从那时起,解析器期望一个表示字符引用的#,或者一个表示实体引用的实体名称,两者后跟一个;。这是正常的行为。
但如果引用名或引用开头的&后面跟着空格或其他分隔符,如",',<,>,&,则结尾;甚至一个表示普通符号的引用&也可以省略:
<p title="&">foo & bar</p>
<p title="&">foo & bar</p>
<p title="&">foo & bar</p>
只有在这些情况下,才能结束;或者甚至引用本身被省略(至少在HTML 4中)。我认为HTML 5需要结尾;。
但是规范建议总是使用字符引用&或者实体引用&为了避免混淆:
作者应该使用“&”(ASCII十进制38)而不是“&”,以避免与字符引用(实体引用打开分隔符)的开头混淆。作者还应该在属性值中使用“&”,因为CDATA属性值中允许使用字符引用。
其他回答
如果你说的是静态文本
<title>Foo & Bar</title>
存储在硬盘上的某个文件中并直接由服务器提供,那么是的:它可能不需要转义。
然而,由于现在很少有HTML内容是完全静态的,我将添加以下免责声明,假设HTML内容是从其他来源生成的(数据库内容、用户输入、web服务调用结果、遗留API结果,……):
如果你不转义一个简单的&,那么很可能你也不转义&或a 或<b>或<script src="http://attacker.com/evil.js">或任何其他无效文本。这意味着您最多只能错误地显示您的内容,并且更有可能受到XSS攻击。
换句话说:当您已经检查和转义其他更有问题的情况时,那么几乎没有理由留下没有完全损坏但仍然有点可疑的独立&未转义的情况。
我认为这已经变成了一个“当浏览器不关心时,为什么要遵循规范”的问题。以下是我的概括回答:
标准不是“现在”的东西。它们是“未来”的东西。作为开发人员,如果我们遵循web标准,那么浏览器供应商就更有可能正确地实现这些标准,我们就更接近一个完全可互操作的web,在那里CSS黑客、功能检测和浏览器检测都是不必要的。我们不需要弄清楚为什么我们的布局会在特定的浏览器中中断,或者如何解决这个问题。
具体来说,如果HTML5不需要使用&在您的特定情况下,并且您正在使用HTML5文档类型(并且还期望您的用户使用兼容HTML5的浏览器),那么没有理由这样做。
好吧,如果它来自用户输入,那么绝对是,因为显而易见的原因。想想如果这个网站没有这样做:这个问题的标题会显示为:我真的需要将“&”编码为“&”吗?
如果它只是echo '<title>Dolce & Gabbana</title>';严格来说,你不需要这么做。这样会更好,但如果你不这样做,没有用户会注意到区别。
如果用户将它传递给您,或者它将在URL中结束,您需要转义它。
如果它以静态文本的形式出现在页面上?所有浏览器都能正确地处理这个问题,您不必太担心,因为它可以工作。
你能告诉我们你的头衔是什么吗?当我提交时
<!DOCTYPE html>
<html>
<title>Dolce & Gabbana</title>
<body>
<p>Am I allowed loose & mpersands?</p>
</body>
</html>
到http://validator.w3.org/ -明确要求它使用实验性的HTML 5模式-它没有抱怨&s…