Markdown 特殊符号完全指南
写 Markdown 的时候,符号问题大概是大家碰到最多的困惑之一。你可能遇到过这些场景:
- 想显示一个星号
*,结果变成了斜体或粗体的标记 - 输入
#开头的文字,被当成标题渲染了 - 需要插入一个版权符号 © 或者注册商标 ®,但键盘上根本找不到
- 写数学公式的时候,
<和>被当成 HTML 标签吞掉了
这些问题说到底都跟 Markdown 特殊符号有关。这篇文章就来把这件事彻底讲清楚——哪些符号在 Markdown 里有特殊含义、怎么让它们原样显示、以及如何在 Markdown 中插入各种你需要的符号。
Markdown 中的格式控制符号
先搞清楚一件事:Markdown 本身并没有"保留字"的概念,它的语法全部建立在标点符号上。CommonMark 规范定义了以下这些字符,它们在特定位置出现时会被当作格式标记:
| 符号 | 字符 | Markdown 中的用途 |
|---|---|---|
| 星号 | * | 粗体、斜体、无序列表 |
| 下划线 | _ | 粗体、斜体 |
| 井号 | # | 标题(H1-H6) |
| 反引号 | ` | 行内代码、代码块 |
| 方括号 | [ ] | 链接文本、图片 alt 文本 |
| 圆括号 | ( ) | 链接地址、图片地址 |
| 尖括号 | < > | HTML 标签、自动链接 |
| 大括号 | { } | 某些扩展语法(如 LaTeX 公式) |
| 加号 | + | 无序列表 |
| 减号/连字符 | - | 无序列表、水平线、表格 |
| 点号 | . | 有序列表(配合数字) |
| 感叹号 | ! | 图片标记 |
| 竖线 | \| | 表格列分隔 |
| 波浪号 | ~ | 删除线(GFM 扩展) |
| 美元符 | $ | LaTeX 数学公式(部分平台) |
| 脱字符 | ^ | 上标(部分扩展) |
关键的一点:这些符号并不是在任何地方都有特殊含义。比如 * 单独出现在句子中间通常不会触发格式化,只有出现在词语两端时才会变成斜体标记。# 只有在行首时才代表标题。
让特殊符号原样显示:三种方法
知道了哪些符号有特殊含义,接下来的问题就是——我只想显示这个符号本身,不想让它变成格式标记,怎么办?有三种方法。
方法一:反斜杠转义(最常用)
在符号前面加一个反斜杠 \,Markdown 解析器就会跳过它,直接显示原字符。这是 CommonMark 规范定义的标准机制。
\*这不是斜体\*
\# 这不是标题
\[这不是链接\](https://example.com)渲染结果:
*这不是斜体* # 这不是标题 [这不是链接](https://example.com)
CommonMark 规范明确列出了 12 个可以通过反斜杠转义的 ASCII 标点字符:
\ ` * _ { } [ ] ( ) # + - . ! |说句实话,大部分情况下你只需要记住 \*、\#、\| 这几个最常用的就够了。其他符号在正常写作中很少需要转义。
有一点要注意:反斜杠只能转义上面列表中的字符。如果你写 \a 或者 \中,反斜杠本身会被原样保留,显示为 \a 和 \中。
方法二:行内代码和代码块
如果你有一大段内容需要显示特殊符号,用反斜杠逐个转义太麻烦了。这时候用行内代码(反引号包裹)或者代码块会更方便:
行内代码:
变量名格式是 `file_name_v2.txt`,密码是 `P@ss#word!`行内代码里的所有内容都会原样显示,Markdown 不会对它做任何格式化处理。
代码块:
```javascript
const regex = /[.*+?^${}()|[\]\\]/g;
const price = "$5 - $10";
代码块里的特殊符号也不需要任何转义,直接写就行。这个方案特别适合展示配置文件、正则表达式、代码片段这类包含大量特殊字符的内容。
### 方法三:HTML 实体
HTML 实体是用 `&` 开头、`;` 结尾的特殊编码,比如 `©` 显示为 ©。Markdown 本身是 HTML 的超集,所以所有 HTML 实体在 Markdown 中都能直接使用。
这个方法主要用于两种场景:
1. **需要插入键盘上没有的符号**(版权、商标、数学符号等)
2. **尖括号 `<` `>` 在某些解析器中转义不稳定**,用 `<` 和 `>` 更可靠
```markdown
版权所有 © 2024
注册商标 ®
小于号 < 大于号 >
省略号…渲染结果:
版权所有 © 2024 / 注册商标 ® / 小于号 < 大于号 > / 省略号…
常用符号速查表
下面这些是写 Markdown 时最常需要的符号,按类别整理好了。
版权与商标符号
| 符号 | HTML 实体 | Unicode 编码 | 说明 |
|---|---|---|---|
| © | © | © | 版权符号 |
| ® | ® | ® | 注册商标 |
| ™ | ™ | ™ | 商标 |
| ℠ | ℠ | ℠ | 服务标志 |
| § | § | § | 章节符号 |
货币符号
| 符号 | HTML 实体 | Unicode 编码 | 说明 |
|---|---|---|---|
| ¥ | ¥ | ¥ | 人民币/日元 |
| € | € | € | 欧元 |
| £ | £ | £ | 英镑 |
| ¢ | ¢ | ¢ | 美分 |
| $ | $ 或 \$ | $ | 美元(注意数学公式冲突) |
对了,美元符号 $ 有个坑——如果你的 Markdown 编辑器或平台支持 LaTeX 数学公式(比如 Obsidian、Jupyter Notebook),$ 会被当成数学公式的定界符。我有一次在 Obsidian 里写 价格是 $5 - $10,结果中间的 5 - 被当成数学表达式渲染了,搞得排版一团糟。遇到这种情况,要么用 \$ 转义,要么把价格放在行内代码里写 `$5 - $10`。
箭头符号
| 符号 | HTML 实体 | 说明 |
|---|---|---|
| → | → 或 → | 右箭头 |
| ← | ← 或 ← | 左箭头 |
| ↔ | ↔ | 左右箭头 |
| ⇒ | ⇒ | 双线右箭头 |
| ⇐ | ⇐ | 双线左箭头 |
| ↑ | ↑ | 上箭头 |
| ↓ | ↓ | 下箭头 |
数学与逻辑符号
| 符号 | HTML 实体 | 说明 |
|---|---|---|
| ± | ± | 正负号 |
| × | × | 乘号 |
| ÷ | ÷ | 除号 |
| ≠ | ≠ | 不等于 |
| ≤ | ≤ | 小于等于 |
| ≥ | ≥ | 大于等于 |
| ≈ | ≈ | 约等于 |
| ∞ | ∞ | 无穷大 |
| √ | √ | 根号 |
| ∑ | ∑ | 求和 |
| ∏ | ∏ | 求积 |
| ∫ | ∫ | 积分 |
| ∴ | ∴ | 所以 |
| ∵ | ∵ | 因为 |
排版符号
| 符号 | HTML 实体 | 说明 |
|---|---|---|
| — | — | 破折号(中文常用) |
| – | – | 短破折号 |
| … | … | 省略号 |
| • | • | 圆点(列表符) |
| ° | ° | 度数符号 |
| ‰ | ‰ | 千分号 |
| ′ | ′ | 角分(分钟) |
| ″ | ″ | 角秒(秒) |
  | 全角空格 | |
  | 半角空格 | |
| 不间断空格 |
不同平台的符号处理差异
这是很多教程不会讲到的部分,但在实际使用中真的很重要。同一个 Markdown 文件,在不同平台上符号的处理方式可能不一样。
GitHub(GFM)
GitHub 使用的是 GitHub Flavored Markdown,它对 CommonMark 做了一些扩展。大部分转义行为和 CommonMark 一致,但有几个不同:
- 表格中的竖线
|不需要转义(它在表格结构中是分隔符,如果不在表格中就是普通字符) - 波浪号
~可以用来创建删除线~~删除~~ - 美元符号
$在 GitHub 上是普通字符,不会被当成数学公式分隔符(GitHub 的数学公式支持是后来加的,需要使用```math代码块语法)
Obsidian
Obsidian 对 Markdown 做了很多扩展,符号处理有些特殊:
$默认是 LaTeX 行内数学公式的定界符,$$是块级数学公式- 如果你要显示字面的
$符号,必须转义\$或者用行内代码 %%是 Obsidian 的注释标记(不会出现在渲染输出中)
Typora
Typora 的行为和 CommonMark 比较接近,但:
- 它支持 LaTeX 数学公式(
$/$$) - 某些 HTML 实体在实时预览模式下可能不显示,但导出时是正确的
VS Code 预览
VS Code 的 Markdown 预览基于不同的插件,行为取决于你安装了什么:
- 内置预览遵循 CommonMark 规范
- 如果装了 Markdown Math 插件,
$会被当成数学公式分隔符 - 建议检查你当前的预览插件配置
我自己的经验是:如果文档需要在多个平台使用,尽量用行内代码来包裹特殊符号,这是兼容性最好的方案。转义字符在大部分平台都能正常工作,但数学公式相关的 $、~、^ 这几个符号在不同平台差异最大,要特别留意。
什么时候不需要转义
不是所有特殊符号都需要转义。以下场景中,符号会自动作为普通字符显示:
在代码块和行内代码中,所有 Markdown 语法都不生效:
这段文字里的 *星号* 和 #井号 都会原样显示在 HTML 标签内部,Markdown 语法通常不解析:
<div>这里的 *星号* 不会变成斜体</div>符号出现在不会触发格式的位置,比如 * 出现在句子中间但没有包裹词语,或者 # 不在行首:
这是一段包含*的文字,星号不会被处理
这个 # 不是标题不过说实话,这种"自动不触发"的行为在不同解析器之间可能不一致,如果你需要确保某个符号一定原样显示,还是老老实实转义或用代码包裹更稳妥。
特殊符号的常见问题
为什么 --- 变成了一条横线?
三个减号 --- 在 Markdown 中是水平分隔线 <hr> 的语法。如果你只是想显示三个减号,可以转义第一个:\---,或者用行内代码 `---`。
表格里的竖线怎么显示?
表格语法本身就用竖线 | 做列分隔。如果你需要在表格内容中显示竖线,用 |(竖线的 HTML 实体编码)。
| 符号 | 写法 |
|------|------|
| 竖线 | | |为什么 < 和 > 后面的内容消失了?
尖括号在 Markdown 中有双重身份——它们既是 HTML 标签的标记,也可能触发自动链接。如果你写的不是合法的 HTML 标签,内容可能会被吞掉。用 < 和 > 代替是最保险的做法。
连续空格为什么只剩一个?
Markdown(和 HTML)会把连续的空格合并成一个。如果你需要保留多个空格,有几种方法:
- 用
(不间断空格)替代普通空格 - 用全角空格(中文输入法下的空格)
- 放在行内代码里
`多个 空格`
数学公式里的符号冲突怎么办?
如果你的平台支持 LaTeX 数学公式($...$),在写价格、范围等包含 $ 的内容时要特别小心。$5-$10 这种写法在支持数学公式的平台上会被错误解析。解决方案:
- 用反斜杠转义:
\$5-\$10 - 放在行内代码里:
`$5 - $10` - 用 HTML 实体:
$5 - $10
参考来源
- CommonMark Spec — Markdown 标准规范,定义了完整的转义字符列表和解析规则
- GitHub Flavored Markdown Spec — GitHub 对 CommonMark 的扩展规范,包括删除线、表格等
- Markdown Guide - Basic Syntax — Markdown 基础语法参考,包含转义字符说明
- Markdown Guide - Cheat Sheet — Markdown 语法速查表
- HTML Entities Reference (MDN) — HTML 实体符号完整参考