HTML 字元编码
在浏览器里转义 HTML 特殊字元,可以选择只转 HTML 必需的最小集合,或全部数值化。
在你的浏览器中运行
第一个几乎永远是对的。最后一个会把中文内容膨胀好几倍,只有旧系统才需要。
还没有东西可以转换。
真正重要的只有五个字元,其余都是偏好
只有五个字元会改变浏览器解析 HTML 的方式:&、<、>、" 和 '。把这五个转义掉,就是
「让文字不会被当成标记读取」的全部,也是这个操作中唯一跟安全有关的部分。
其他所有东西——©、—、£、中文、emoji——在一份 UTF-8 文件里都只是普通文字,完全不需要
转义。所以**「只转 HTML 必须转的」几乎永远是对的**,它也是默认值。
另外两个选项有其真实但狭窄的用途:
- 有名称的就用名称会产生
©和—,有些人偏好在原始码里看到这种写法。 - 所有非 ASCII 字元会把每一个重音字母与中日韩字元都数值化。一页中文会膨胀到大约六倍长。 只有在某个系统真的完全无法承载 UTF-8 时才用它——而那种情况比以前少得多了。
顺序有意义,这就是 & 要先转的原因
& 必须第一个被转义。如果它排在最后,< 会先变成 <,接着那个 & 又会被转一次变成
&lt;,显示出来就是字面上的 < 而不是一个小于符号。
转义不是幂等的,也不该是。跑两次本来就会得到不同的结果——这正是为什么你应该在输出的那一刻 转义一次,而不是把转义过的文字存进数据库。
解码三种写法都吃
、  和   是同一个字元的三种写法,解码器三种都接受,也包括旧标记里会
出现的大写 &#X 变体。
任何它不认得的东西都会原封不动留着。R&D 还是 R&D,不会被弄乱,因为一个后面没有接合法
实体的 &,就只是一个 & 而已。
有两种情况是刻意拒绝的:指向单一代理码位的escape(�),以及超出 Unicode 范围的escape。
两者都不是字元,硬要生出一个只会让输出坏掉。
这不是消毒
转义让文字可以安全地显示,但不会让不受信任的 HTML 可以安全地嵌入——那需要一个懂得 标签与属性的消毒工具。如果你要把使用者送出的标记贴进页面里,这不是你要的工具。
没有任何上传
全部都在这个页面里执行。