源本科技 | 码上会

HTML 实体

2025/12/29
29
0

学习目标

  • 理解 HTML 实体 的作用与必要性

  • 掌握 保留字符(如 <, >, &)的转义方法

  • 熟悉常用 命名实体数字实体 的使用场景

  • 学会处理 不可见空格货币符号数学符号 等特殊内容

  • 遵循 最佳实践,提升代码可读性与兼容性


什么是 HTML 实体

HTML 实体(HTML Entities) 是用于在网页中安全显示特殊字符的编码方式。这些字符要么:

  • 在 HTML 中有保留含义(如 < 表示标签开始)

  • 无法直接输入(如 ©、€、∞)

  • 浏览器会自动合并或忽略(如多个连续空格)

基本语法

&实体名称;       <!-- 命名实体 -->
&#数字;          <!-- 十进制数字实体 -->
&#x十六进制;     <!-- 十六进制数字实体 -->

所有实体必须以 & 开头,以 ; 结尾


为什么需要实体

场景

问题

解决方案

显示 < 符号

浏览器误认为是标签开始

使用 &lt;

显示 &copy;

& 被解析为实体起始符

使用 &amp;copy;

多个连续空格

浏览器只显示一个空格

使用 &nbsp;

显示欧元符号 €

键盘无此键或编码不支持

使用 &euro;&#8364;

核心原则任何可能被 HTML 解析器误解的字符,都应使用实体表示。


三大类常用实体

1. 保留字符

必须转义

字符

含义

命名实体

数字实体

<

小于号 / 标签开始

&lt;

&#60;

>

大于号 / 标签结束

&gt;

&#62;

&

实体起始符

&amp;

&#38;

"

双引号(属性值中)

&quot;

&#34;

'

单引号(属性值中)

&apos;

&#39;

示例:安全显示代码片段

<p>在 HTML 中,if 条件写作:if (a &lt; b) { ... }</p>
<!-- 渲染为:if (a < b) { ... } -->

⚠️ 严重错误:若在属性值中未转义引号:

<!-- 错误! -->
<img src="image.jpg" alt="He said "Hello"">
<!-- 正确 -->
<img src="image.jpg" alt="He said &quot;Hello&quot;">

2. 常用符号与标点

符号

描述

命名实体

数字实体

 

不间断空格

&nbsp;

&#160;

©

版权符号

&copy;

&#169;

®

注册商标

&reg;

&#174;

商标符号

&trade;

&#8482;

°

度数符号

&deg;

&#176;

±

正负号

&plusmn;

&#177;

无穷大

&infin;

&#8734;

右箭头

&rarr;

&#8594;

红心

&hearts;

&#9829;

示例:专业排版

<p>温度:25&deg;C</p>
<p>误差范围:&plusmn;2%</p>
<p>版权所有 &copy; 2025 MySite</p>

3. 货币符号

货币

符号

命名实体

数字实体

美元

$

&#36;

(无命名实体)

欧元

&euro;

&#8364;

英镑

£

&pound;

&#163;

日元

¥

&yen;

&#165;

印度卢比

&#8377;

比特币

&#8383;

注意:美元符号 $ 通常无需转义,但为统一风格可用 &#36;


特殊功能实体

不间断空格

&nbsp;

  • 作用:防止浏览器合并空格或在单词间换行

  • 典型场景

    • 人名:张&nbsp;三

    • 单位:100&nbsp;km/h

    • 编号:第&nbsp;1&nbsp;章

<!-- 防止 "12:00 PM" 被拆到两行 -->
<p>会议时间:12:00&nbsp;PM</p>

数学与科学符号

符号

含义

实体

求和

&sum;

连乘

&prod;

偏微分

&part;

属于

&isin;

空集

&empty;

Nabla 算子

&nabla;

适用于学术、技术类网站

组合变音符号

通过组合字符生成带重音的字母:

基础字母

+ 重音符

= 结果

HTML 写法

a

&#768;(grave)

à

a&#768;

a

&#769;(acute)

á

a&#769;

O

&#770;(circumflex)

Ô

O&#770;

注意:现代网页更推荐直接使用 UTF-8 编码输入这些字符(如 á),而非组合实体。


命名实体 vs 数字实体

类型

优点

缺点

推荐场景

命名实体
(如 &lt;

可读性强,易记忆

支持字符有限

优先使用(保留字符、常用符号)

十进制数字实体
(如 &#60;

支持所有 Unicode 字符

难记忆,可读性差

命名实体不存在时

十六进制数字实体
(如 &#x3C;

紧凑,程序员友好

非开发者难理解

技术文档或脚本生成

最佳实践

<!-- 推荐:可读性高 -->
<p>版权 &copy; 2025</p>
<p>a &lt; b &amp;&amp; b &gt; c</p>

<!-- 避免:除非必要 -->
<p>&#169; 2025</p>
<p>&#60;script&#62;</p>

常见错误

错误

风险

修正

忘记转义 <

页面结构破坏,XSS 风险

&lt;

在属性中未转义 "

属性提前结束

&quot;

用多个普通空格代替 &nbsp;

空格被合并

&nbsp;

混淆 &&amp;

实体解析失败

所有 & 必须写成 &amp;

危险示例(XSS 漏洞):

<!-- 用户输入:<script>alert('hack')</script> -->
<div>评论:{{ user_input }}</div>
<!-- 若未转义,将执行恶意脚本! -->

<!-- 安全做法:转义所有 < > & " ' -->
<div>评论:&lt;script&gt;alert(&#39;hack&#39;)&lt;/script&gt;</div>

安全提示:用户生成内容(UGC)必须进行 HTML 转义!


实体使用建议

  1. UTF-8 是默认编码

    • <head> 中声明:<meta charset="UTF-8">

    • 大多数符号(如 ©、€、→)可直接输入,无需实体

  2. 仅对保留字符强制使用实体

    • <, >, &, ", ' 必须转义

    • 其他符号按团队规范决定

  3. 框架自动转义

    • React、Vue、Angular 等框架在渲染时自动转义文本内容

    • 仅在 dangerouslySetInnerHTML 等特殊场景需手动处理


重点总结

要点

说明

实体格式

&name;&#number;

必须转义

<, >, &, ", '

&nbsp; 用途

防止空格合并与换行

命名实体优先

提升代码可读性

安全第一

用户输入务必转义,防 XSS

UTF-8 时代

多数符号可直接输入,实体非必需


思考题

  1. 为什么在 HTML 属性值中使用双引号时,内部的双引号必须转义?单引号是否也需要?

  2. 如何用 HTML 实体实现“10⁵”这样的上标效果?是否有更好的替代方案?

  3. 在支持 UTF-8 的现代网页中,哪些场景仍必须使用 HTML 实体?哪些可以避免?