转义字符

写文档总会遇到一些「本来就不是语法、但长得像语法」的字符:一个书名想用星号括起来,一行以 # 开头的说明,或者一个 Windows 路径里的反斜杠。Markdown 的处理方式很直接——在字符前面加一个反斜杠,这个字符就只当普通字符看待。这一页讲清转义能作用于哪些字符、转义的边界在哪,以及一个最常被搞反的地方:代码里恰恰不能转义。

转义什么

规范允许用反斜杠转义 ASCII 标点——星号、井号、反引号、下划线、方括号、圆括号、反斜杠本身等等。

\*不会变成强调\*

\# 不会变成标题

\`不会变成代码\`
<p>*不会变成强调*</p>
<p># 不会变成标题</p>
<p>`不会变成代码`</p>

转义后的字符原样显示,只是不再触发语法。

反斜杠只作用一个字符

反斜杠不负责「转义后面一整串」,它只挡住紧随其后的那一个字符:

\*a\*b
<p>*a*b</p>

字母前面加反斜杠没有意义

反斜杠只能转义标点。字母前面加反斜杠,反斜杠会原样留在页面上:

\a 普通反斜杠
<p>\a 普通反斜杠</p>

这条规则反过来用很省心:Windows 路径不用转义。C:\Users\demo 里的反斜杠后面是字母,所以会原样显示:

路径是 C:\Users\demo。
<p>路径是 C:\Users\demo。</p>

反斜杠自己也要转义

想显示一个反斜杠,就写两个:

C:\\Users\\test
<p>C:\Users\test</p>

行首符号的转义

行首的 -、1.、> 都有特殊含义,转义它们就可以让它们退回普通文字:

\- 不是列表
1\. 不是有序列表
\> 不是引用
<p>- 不是列表
1. 不是有序列表
> 不是引用</p>

代码里不能转义

行内代码和代码块里的内容不做转义处理。这意味着反斜杠会连同后面的字符一起原样显示出来:

`\*not em\*`
<p><code>\*not em\*</code></p>

常见坑

写法实际渲染原因
星号前加反斜杠星号原样显示反斜杠转义了星号
反引号前加反斜杠反引号原样显示反斜杠转义了反引号
字母前加反斜杠反斜杠仍在只能转义标点
代码里写反斜杠加星号反斜杠和星号都在代码内不做转义
连续两个反斜杠一个反斜杠反斜杠自己也要转义

练习

把下面这段内容改写成 Markdown,要求:书名两侧的星号原样显示、不变成斜体;行首的井号不被识别成标题;Windows 路径原样保留;最后一句里的星号放在行内代码里,不要做任何转义。

*学习通识* 这本书值得一读。

# 不是标题

路径是 C:\Users\demo。

代码里的 *星号* 不转义。
行内代码

解题思路: 三个符号要分别处理。星号和井号是 Markdown 的语法字符,要让它们只当普通字符看,就在前面加一个反斜杠。路径里的反斜杠后面跟的是字母,本来就不会被当成转义,直接原样写即可。最后一句的星号放进行内代码,代码内部不做任何转义处理,反斜杠反而会原样显示出来。

详细步骤:

  1. 书名的两个星号各自加一个反斜杠,写成 \*学习通识\*。这样渲染出来是原样的星号,不会变成斜体。
  2. 行首的井号加反斜杠,写成 \# 不是标题,它就不再是标题行,而是普通段落。
  3. 路径保持原样,写成 C:\Users\demo。反斜杠后面是字母,不构成转义,加了反而会多出字符。
  4. 最后一句的星号用行内代码包起来,写成 `*星号*`,代码内不解析,也不需要转义。
  5. 检验:渲染后星号、井号都原样显示,路径里的反斜杠完整保留,代码里的星号保持等宽原样。

最终答案:

\*学习通识\* 这本书值得一读。

\# 不是标题

路径是 C:\Users\demo。

代码里的 `*星号*` 不转义。

小结

读完这一页,你应当能说出反斜杠只能转义标点、能解释代码里为什么不转义,能写出反斜杠自己的转义写法,也能在看到「多出一个反斜杠」时想到是代码里多此一举加了转义。

发现内容有问题?

告诉我们哪里需要改进。