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 实体是用 `&` 开头、`;` 结尾的特殊编码,比如 `&copy;` 显示为 ©。Markdown 本身是 HTML 的超集,所以所有 HTML 实体在 Markdown 中都能直接使用。

这个方法主要用于两种场景:

1. **需要插入键盘上没有的符号**(版权、商标、数学符号等)
2. **尖括号 `<` `>` 在某些解析器中转义不稳定**,用 `&lt;` 和 `&gt;` 更可靠

```markdown
版权所有 &copy; 2024
注册商标 &reg;
小于号 &lt; 大于号 &gt;
省略号&hellip;

渲染结果:

版权所有 © 2024 / 注册商标 ® / 小于号 < 大于号 > / 省略号…

常用符号速查表

下面这些是写 Markdown 时最常需要的符号,按类别整理好了。

版权与商标符号

符号HTML 实体Unicode 编码说明
©&copy;&#169;版权符号
®&reg;&#174;注册商标
&trade;&#8482;商标
&#8480;&#8480;服务标志
§&sect;&#167;章节符号

货币符号

符号HTML 实体Unicode 编码说明
¥&yen;&#165;人民币/日元
&euro;&#8364;欧元
£&pound;&#163;英镑
¢&cent;&#162;美分
$&#36;\$&#36;美元(注意数学公式冲突)

对了,美元符号 $ 有个坑——如果你的 Markdown 编辑器或平台支持 LaTeX 数学公式(比如 Obsidian、Jupyter Notebook),$ 会被当成数学公式的定界符。我有一次在 Obsidian 里写 价格是 $5 - $10,结果中间的 5 - 被当成数学表达式渲染了,搞得排版一团糟。遇到这种情况,要么用 \$ 转义,要么把价格放在行内代码里写 `$5 - $10`

箭头符号

符号HTML 实体说明
&rarr;&#8594;右箭头
&larr;&#8592;左箭头
&#8596;左右箭头
&#8658;双线右箭头
&#8656;双线左箭头
&#8593;上箭头
&#8595;下箭头

数学与逻辑符号

符号HTML 实体说明
±&plusmn;正负号
×&times;乘号
÷&divide;除号
&ne;不等于
&le;小于等于
&ge;大于等于
&asymp;约等于
&infin;无穷大
&radic;根号
&sum;求和
&prod;求积
&int;积分
&there4;所以
&#8757;因为

排版符号

符号HTML 实体说明
&mdash;破折号(中文常用)
&ndash;短破折号
&hellip;省略号
&bull;圆点(列表符)
°&deg;度数符号
&permil;千分号
&prime;角分(分钟)
&#8243;角秒(秒)
&emsp;全角空格
&ensp;半角空格
&nbsp;不间断空格

不同平台的符号处理差异

这是很多教程不会讲到的部分,但在实际使用中真的很重要。同一个 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> 的语法。如果你只是想显示三个减号,可以转义第一个:\---,或者用行内代码 `---`

表格里的竖线怎么显示?

表格语法本身就用竖线 | 做列分隔。如果你需要在表格内容中显示竖线,用 &#124;(竖线的 HTML 实体编码)。

| 符号 | 写法 |
|------|------|
| 竖线 | &#124; |

为什么 <> 后面的内容消失了?

尖括号在 Markdown 中有双重身份——它们既是 HTML 标签的标记,也可能触发自动链接。如果你写的不是合法的 HTML 标签,内容可能会被吞掉。用 &lt;&gt; 代替是最保险的做法。

连续空格为什么只剩一个?

Markdown(和 HTML)会把连续的空格合并成一个。如果你需要保留多个空格,有几种方法:

  • &nbsp;(不间断空格)替代普通空格
  • 用全角空格(中文输入法下的空格)
  • 放在行内代码里 `多个 空格`

数学公式里的符号冲突怎么办?

如果你的平台支持 LaTeX 数学公式($...$),在写价格、范围等包含 $ 的内容时要特别小心。$5-$10 这种写法在支持数学公式的平台上会被错误解析。解决方案:

  1. 用反斜杠转义:\$5-\$10
  2. 放在行内代码里:`$5 - $10`
  3. 用 HTML 实体:&#36;5 - &#36;10

参考来源