Markdown 轉義字元完全指南

寫 Markdown 的時候,有沒有遇到過這樣的情況——明明輸入的是 *hello*,結果渲染出來變成了 hello(斜體)?或者寫 # 標題,結果被當成了真正的標題?

這就是 Markdown 的「特殊字元」在搞鬼。像星號、井號、方括號這些符號,在 Markdown 中都有格式化功能。如果你想讓它們乖乖地以原始面目示人,就需要用到 Markdown 轉義(escape)

什麼是 Markdown 轉義?

轉義的本質很簡單:在特殊字元前面加一個反斜線 \,告訴 Markdown 解析器「這個符號別處理,原樣顯示」。

比如:

\*這不是斜體\*

渲染結果是:*這不是斜體*(星號原樣顯示,不會變成斜體)。

這個規則來自 Markdown 的原始設計——John Gruber 在最初的語法文件中就定義了反斜線轉義機制 [^1]。

哪些字元可以轉義?完整列表

下面是 Markdown 支持轉義的全部字元:

字元名稱常見用途
\反斜線轉義本身
`反引號行內程式碼
*星號加粗/斜體
_底線加粗/斜體
{}花括號部分擴展語法
[]方括號連結/圖片
()圓括號連結
#井號標題
+加號無序清單
-減號/連字號無序清單/分隔線
.句號有序清單
!驚嘆號圖片
|管道符表格(擴展語法)[^2]

一共 13 個字元(管道符 | 在部分解析器中支持)。說實話這個列表不長,但幾乎覆蓋了所有會「搗亂」的符號。

管道符的特殊情況

管道符 | 是個需要單獨說一下的字元。在標準 Markdown 中它沒有特殊含義,但如果你用了表格語法(GitHub Flavored Markdown 擴展),管道符就是表格列的分隔符。所以在表格內容中顯示管道符,需要轉義:

| 命令 | 說明 |
|------|------|
| `ls \| grep test` | 列出檔案並過濾 |

不過在程式碼區塊裡寫管道符是不需要轉義的,這一點後面會說。

常見轉義場景

顯示星號和底線

這是最常見的場景。當你在寫數學公式或普通文字時,經常需要顯示原始的星號或底線:

分數計算:score \= 100 \* 0.8 \+ 20

檔案路徑:C:\\Users\\\_sunson\\\_docs

渲染結果中,星號和底線都會原樣顯示,不會被解析為加粗或斜體。

顯示井號(不被當成標題)

在討論議題編號、顏色代碼等場景中,經常需要顯示 #

今天討論的議題是 \#42 和 \#108

背景色使用 \#FFFFFF

顯示方括號和圓括號

當你在文字中需要展示連結語法本身,而不是一個真正的連結時:

連結語法格式是:\[顯示文字\]\(URL\)

不用反斜線的轉義方法

反斜線是最常用的轉義方式,但不是唯一的。根據場景,還有幾個替代方案。

用行內程式碼包裹

把內容放在反引號 ` 裡面,所有特殊字元都不會被解析:

`**不會加粗**`  → **不會加粗**(原樣顯示)

`# 不是標題`    → # 不是標題

`[不是連結](url)` → [不是連結](url)

這是我最推薦的方式——當你只是想讓某個片段原樣顯示時,行內程式碼比逐個字元加反斜線方便得多。特別是在寫技術文件的時候,程式碼本身就是用反引號標記的,一舉兩得。

用程式碼區塊

如果是多行內容需要原樣展示,用三個反引號的程式碼區塊就行:

```markdown
**這段文字不會加粗**
## 這不是標題
[這不是連結](https://example.com)

在程式碼區塊裡,Markdown 的格式化功能完全失效,所有字元原樣顯示,不需要任何轉義。

### 用 HTML 實體

對於 `<` 和 `>` 這兩個符號,有時候用 HTML 實體更穩妥:

```markdown
&lt;div&gt;     → <div>(原樣顯示)

5 &gt; 3       → 5 > 3

HTML 實體 &lt; 表示 <&gt; 表示 > [^3]。在部分解析器中,直接寫 < 可能被當成 HTML 標籤處理,用實體可以避免這個問題。

程式碼區塊巢狀:一個容易踩的坑

這個話題稍微深入一點。當你在 Markdown 中需要「展示一段 Markdown 程式碼」,也就是程式碼區塊裡包含程式碼區塊時,會遇到轉義的巢狀問題。

基本思路:用更多反引號

外層程式碼區塊用比內層更多的反引號就行。比如內層是三個反引號,外層就用四個:

````markdown
```javascript
console.log("hello");

另一個選擇:用波浪線

除了反引號,還可以用 ~~~ 作為程式碼區塊的定界符,這樣就不會和反引號衝突:

```javascript
console.log("hello");
```

有一次我在 GitHub 上寫教學,需要展示一個包含程式碼區塊的 Markdown 範例,結果三個反引號巢狀直接把渲染搞亂了。後來改用四個反引號才解決。說實話這個問題不常遇到,但遇到了就很頭痛——Rick Strahl 在他的部落格中也詳細討論過這個「套娃式」的巢狀方案 [^4]。

行內程式碼中轉義反引號

這個是 Stack Exchange 上一個 37 萬瀏覽量的經典問題 [^5]。在行內程式碼裡,你沒法用反斜線轉義反引號(因為行內程式碼內不處理轉義)。解決方案是用雙反引號包裹:

`` ` ``  → ` (顯示一個反引號)
`` `` ` `` ``  → `` ` `` (顯示兩個反引號)

注意雙反引號和內容之間加一個空格,這樣開頭的反引號才不會被當成結束標記。

不同平台的差異

這是很多人容易忽略的一點:不同的 Markdown 解析器對轉義的支持是有差異的

字元CommonMarkGFM (GitHub)ObsidianTypora
基本轉義(13字元)
管道符 \|
表格內轉義⚠️ 部分支持
行末 \ 換行
轉義空格✅ (non-breaking)

大部分基礎轉義在所有平台上都能正常運作。差異主要體現在一些邊緣場景,比如表格內的轉義和某些擴展語法中。Yihui 在 R Markdown Cookbook 中也提到過,轉義空格會產生「不換行空格」(non-breaking space),這個行為在不同環境中效果可能略有不同 [^6]。

常見問題

轉義了但不生效怎麼辦?

首先確認兩件事:

  1. 是不是在程式碼區塊裡加的反斜線? 程式碼區塊內反斜線不會被解釋為轉義,它就是普通字元。如果要在程式碼區塊裡顯示反斜線,直接寫就行,不需要額外轉義。

  2. 反斜線後面是不是可轉義字元? Markdown 只對上面列表裡的 13 個字元生效。如果你寫 \a\b,反斜線和字母都會原樣顯示,不會有任何變化。

怎麼顯示反斜線本身?

反斜線自身的轉義就是兩個反斜線:

\\ → \

如果要顯示多個反斜線,就是成對使用:\\\\\\

行末反斜線是什麼意思?

在行末加一個反斜線表示「軟換行」,相當於在下一行繼續當前段落,而不是新起一個段落:

這是一段很長的文字,\
但在渲染時它們會連在一起顯示。

這個用法來自 CommonMark 規範,在 GitHub、Obsidian、Typora 中都支援 [^1]。

表格裡怎麼顯示管道符?

在表格的儲存格中顯示管道符,用反斜線轉義:

| 命令 | 說明 |
|------|------|
| `a \|\| b` | 邏輯或運算 |

或者把包含管道符的內容放在程式碼標記裡(行內程式碼或程式碼區塊),這樣也不需要手動轉義。

速查表

最後放一張速查表,方便需要的時候快速查找:

想顯示的字元寫法說明
\\\反斜線
` | \` 或雙反引號包裹反引號
*\*星號
_\_底線
#\#井號
+\+加號
-\-減號
.\.句號
!\!驚嘆號
[]\[ \]方括號
()\( \)圓括號
{}\{ \}花括號
\|\|管道符
<&lt;HTML 實體
>&gt;HTML 實體

相關內容


[^1]: John Gruber, "Markdown Syntax Documentation," Daring Fireball. https://daringfireball.net/projects/markdown/syntax[^2]: Markdown Guide, "Basic Syntax." https://www.markdownguide.org/basic-syntax[^3]: MDtoLink Blog, "Markdown Escape Characters: The Complete List." https://mdtolink.com/blog/markdown-escape-characters/[^4]: Rick Strahl, "Escaping Markdown Code Snippets and Inline Code as Markdown," West Wind Weblog, 2022. https://weblog.west-wind.com/posts/2022-Feb-16-Escaping-Markdown-Code-Snippets-and-Inline-Code-as-Markdown[^5]: Stack Exchange Meta, "How do I escape a backtick within in-line code in Markdown?" https://meta.stackexchange.com/questions/82718[^6]: Yihui Xie, "Special Characters," R Markdown Cookbook. https://yihui.org/rmarkdown-cookbook/special-chars