哪些字符必须转义
HTML 用尖括号标记标签、用和号开始实体,所以正文里出现这些字符时必须转义,否则浏览器会当成标记来解析,轻则排版错乱,重则被注入脚本。必须处理的有五个:和号写成 &、小于号写成 <、大于号写成 >、双引号写成 "、单引号写成 '。其中引号只在放进标签属性里时才必须转义,但统一处理更安全。还要注意顺序:编码时一定先替换和号再替换其他字符,否则先生成的实体里的和号会被二次编码,页面上就会直接显示出实体本身的文字。
实体有两种写法。命名实体如不间断空格、版权号、破折号,可读性好,但不同 HTML 版本支持的名字不同,XML 里只有五个基本实体可用。数字实体更通用:十进制写成井号加码点,十六进制在井号后加 x,任何 Unicode 码点都能这样写。本工具编码非 ASCII 字符时采用十六进制形式,并正确处理了 emoji 这类需要代理对表示的字符。
常见用途与注意事项
最常见的用途是防止跨站脚本攻击:把用户提交的内容原样拼进页面前必须转义,否则对方输入一段脚本标签就能在别人的浏览器里执行。不过转义要看位置,放进标签属性、网址参数、JavaScript 字符串或样式表里各有各的规则,只做 HTML 实体转义并不够;现代前端框架通常默认转义,只有在使用类似 innerHTML 的接口时才需要自己处理。
第二个用途是排版。不间断空格让两侧内容不会在此断行,常用于日期、单位和数字之间,但连续用它撑排版是坏习惯,间距应当交给样式表。全角空格是一个汉字宽,中文段落缩进可以用它,不过更推荐用首行缩进属性。此外从网页复制来的文本里常混入码点 160 的不间断空格而不是普通空格,肉眼看不出差别,却会导致查找替换失败、正则匹配不到,用本工具解码后再比对就能发现。解码时遇到不认识的命名实体会原样保留并统计数量,方便定位问题。