我可以想到几种可能性来解释为什么有时字符串没有被转义:
- 也许最初的程序员相信在某些地方字符串没有特殊字符(但是,在我看来,这将是糟糕的编程实践;为了防止将来的更改,转义字符串的成本非常低)
- 该字符串在代码中的该点已被转义。你绝对不想两次转义一个字符串;用户最终将看到转义序列而不是预期的文本。
- 该字符串是实际的 html 本身。你不想逃避html;你希望浏览器处理它!
编辑 - 转义的原因是特殊字符喜欢并且最终可能导致浏览器显示您预期之外的内容。从技术上讲,裸露是 html 中的错误。大多数浏览器都试图智能地处理此类错误,并且在大多数情况下会正确显示它们。(例如,如果字符串是 中的文本,则几乎肯定会在示例文本中发生这种情况。但是,由于它是糟糕的标记,因此某些浏览器将无法正常工作;辅助技术(例如文本到语音转换)可能会失败;可能还有其他问题。&
<
&
<div>
尽管浏览器尽最大努力从错误的标记中恢复,但仍有几种情况会失败。如果示例字符串是属性值,则绝对需要转义引号。浏览器无法正确处理以下情况:
<img alt=""bread" & "butter"" ... >
一般规则是,任何不是标记但可能被混淆为标记的字符都需要转义。
请注意,在多个上下文中,文本可以出现在 html 文档中,并且它们对转义有单独的要求。应转义以下内容:
- 文档字符集中没有表示形式的所有字符(如果您使用的是 UTF-8,则不太可能,但情况并非总是如此)
- 在属性值中,引号(或 ,与属性值本身使用的分隔符匹配的任何一个)和 & 符号 (),但不能
'
"
&
<
- 在文本节点内,仅和
&
<
- 在 href 值中,需要在 url 中转义的字符(有时这些字符需要双重转义,以便在浏览器取消转义一次后仍会转义它们)
- 在 CDATA 块中,通常没有(在 HTML 级别)。
最后,除了双重转义的危险之外,转义所有文本的成本是最小的:网络上有一点点额外的处理和一些额外的字节。