字符实体编码是将特殊符号转换为html安全字符串的机制,用于防止解析错误和xss攻击;必须对、&、"等符号转义,命名式易读但支持有限,数字式全覆盖但难记,中文等非ascii字符应优先用utf-8而非实体。

什么是字符实体编码,为什么不能直接写特殊符号
HTML 解析器看到 会认为是标签开始,看到 <code>& 会尝试解析后续是否为合法实体(如 )。如果直接写 <div>Price: 10&20</div>,浏览器可能把 &20 当作未闭合的实体而报错或渲染异常。所以必须用实体编码显式声明“这里不是语法标记,就是字面意思”。
常用字符实体的写法与选择依据
实体分命名式(如 ©)和数字式(如 © 或 ©)。命名式易读但支持有限(仅约 250 个),数字式全覆盖但难记。实际开发中建议:
- 版权、注册商标等高频符号优先用命名式:
©、®、™ - 引号、小于号、大于号、和号必须转义:
"、<、>、&(注意&本身要双写&) - 非 ASCII 字符(如中文、emoji)一般不用实体——直接保存为 UTF-8 并声明
<meta charset="utf-8">更可靠;强行用😊易出错且可读性差
JavaScript 动态插入时如何安全生成实体
用 innerHTML 直接拼接用户输入的字符串极易引发 XSS,比如 el.innerHTML = "Hello " + userInput 遇到 <script>alert(1)</script> 就执行了。正确做法是只对纯文本内容做实体转义:
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
function escapeHtml(text) {
const div = document.createElement('div');
div.textContent = text;
return div.innerHTML;
}
// 使用:escapeHtml('<hello> & "world"') → '<hello> & "world"'</hello>
注意:不要用正则反复替换(如 .replace(/&/g, '&')),顺序错误会导致二次转义();<code>textContent 方案由浏览器原生保证顺序和完整性。
服务端模板里实体编码的常见陷阱
很多模板引擎(如 EJS、Django、Thymeleaf)默认对变量插值做 HTML 转义,但开发者常误以为“已安全”而忽略上下文:
- 在
<script></script>标签内直接插值:<script>var name = "<%= user.name %>";</script>—— 即使user.name已转义,引号和反斜杠仍可能破坏 JS 字符串,应改用 JSON 序列化:JSON.stringify(user.name) - 在属性值中嵌入未包裹引号的值:
<div data-id="<%=" id>></div>—— 若id含空格或>,会提前截断属性。必须加引号并确保内部不破坏结构 - 富文本场景(如 CMS 编辑器输出)不该盲目转义,而应使用白名单过滤(如 DOMPurify),否则
<strong></strong>也会被干掉
实体编码不是银弹,它只解决“把字符当文本显示”这一件事;语义边界在哪,转义就得跟到哪,越界就失效。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










