html中&、等字符不能直接写,因为浏览器会将其解析为标签或实体的语法符号,导致渲染错误;必须用&、等实体编码才能原样显示。

HTML中&<code>>这些字符为什么不能直接写
因为浏览器会把它们当成标签或属性语法的一部分来解析。比如写x ,解析器在<code>处就认为新标签开始了,后面<code>y变成孤立文本,整个结构错乱;写name="John & Jane",&会被当作实体起始符,若后面没跟合法实体名(如amp;),可能报错或截断。
用textContent还是innerHTML做HTML编码
想把原始字符串转成安全的HTML实体(比如把变成<code>),该用<code>textContent配合innerHTML:
- 创建临时
div:const temp = document.createElement('div') - 赋值:
temp.textContent = '5 - 取结果:
temp.innerHTML→ 得到5
别反着用——innerHTML = raw; temp.textContent会直接执行HTML,有XSS风险;也别用innerText,它会抹掉空格、换行,还受CSS影响。
什么时候该用encodeURIComponent而不是HTML实体
encodeURIComponent是为URL设计的,不是为HTML内容准备的。它把变成<code>%3C,把空格变成%20,但这些在HTML里不会自动还原成字符,反而显示为乱码。
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
只在以下场景用它:
- 把HTML字符串作为URL参数传递(比如
?content=...&type=html) - 此时必须先对HTML内容做
encodeURIComponent,接收端再用decodeURIComponent还原 - 注意:这是「传输编码」,不是「HTML编码」;还原后仍需确保内容不被
innerHTML直接执行(应先转义或用textContent)
服务端渲染或模板里怎么避免双重转义
像Django、Jinja、EJS这类模板引擎默认会对变量做HTML转义,但如果你传入的已经是转义后的字符串(比如<p>hello</p>),再转一次就变成<p>hello</p>,页面上显示的就是源码而非渲染效果。
解决办法取决于上下文:
- React用
dangerouslySetInnerHTML时,值必须是未转义的原始HTML - Vue用
v-html同理,传入前确认没被额外转义 - Node.js用
he.encode()库时,明确传{ useNamedReferences: true }提升可读性 - PHP用
htmlspecialchars($str, ENT_QUOTES, 'UTF-8'),别漏掉第三个参数,否则中文可能乱码
最容易忽略的是:前后端协作时,同一段HTML在API响应里是已转义的,前端又调一次he.encode,结果层层嵌套。建议约定「传输层不转义,展示层按需转义」。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










