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
<div> → <div>(原樣顯示)
5 > 3 → 5 > 3HTML 實體 < 表示 <,> 表示 > [^3]。在部分解析器中,直接寫 < 可能被當成 HTML 標籤處理,用實體可以避免這個問題。
程式碼區塊巢狀:一個容易踩的坑
這個話題稍微深入一點。當你在 Markdown 中需要「展示一段 Markdown 程式碼」,也就是程式碼區塊裡包含程式碼區塊時,會遇到轉義的巢狀問題。
基本思路:用更多反引號
外層程式碼區塊用比內層更多的反引號就行。比如內層是三個反引號,外層就用四個:
````markdown
```javascript
console.log("hello");
另一個選擇:用波浪線
除了反引號,還可以用 ~~~ 作為程式碼區塊的定界符,這樣就不會和反引號衝突:
```javascript
console.log("hello");
```有一次我在 GitHub 上寫教學,需要展示一個包含程式碼區塊的 Markdown 範例,結果三個反引號巢狀直接把渲染搞亂了。後來改用四個反引號才解決。說實話這個問題不常遇到,但遇到了就很頭痛——Rick Strahl 在他的部落格中也詳細討論過這個「套娃式」的巢狀方案 [^4]。
行內程式碼中轉義反引號
這個是 Stack Exchange 上一個 37 萬瀏覽量的經典問題 [^5]。在行內程式碼裡,你沒法用反斜線轉義反引號(因為行內程式碼內不處理轉義)。解決方案是用雙反引號包裹:
`` ` `` → ` (顯示一個反引號)
`` `` ` `` `` → `` ` `` (顯示兩個反引號)注意雙反引號和內容之間加一個空格,這樣開頭的反引號才不會被當成結束標記。
不同平台的差異
這是很多人容易忽略的一點:不同的 Markdown 解析器對轉義的支持是有差異的。
| 字元 | CommonMark | GFM (GitHub) | Obsidian | Typora |
|---|---|---|---|---|
| 基本轉義(13字元) | ✅ | ✅ | ✅ | ✅ |
管道符 \| | ✅ | ✅ | ✅ | ✅ |
| 表格內轉義 | ✅ | ✅ | ⚠️ 部分支持 | ✅ |
行末 \ 換行 | ✅ | ✅ | ✅ | ✅ |
| 轉義空格 | ✅ (non-breaking) | ✅ | ✅ | ✅ |
大部分基礎轉義在所有平台上都能正常運作。差異主要體現在一些邊緣場景,比如表格內的轉義和某些擴展語法中。Yihui 在 R Markdown Cookbook 中也提到過,轉義空格會產生「不換行空格」(non-breaking space),這個行為在不同環境中效果可能略有不同 [^6]。
常見問題
轉義了但不生效怎麼辦?
首先確認兩件事:
是不是在程式碼區塊裡加的反斜線? 程式碼區塊內反斜線不會被解釋為轉義,它就是普通字元。如果要在程式碼區塊裡顯示反斜線,直接寫就行,不需要額外轉義。
反斜線後面是不是可轉義字元? Markdown 只對上面列表裡的 13 個字元生效。如果你寫
\a或\b,反斜線和字母都會原樣顯示,不會有任何變化。
怎麼顯示反斜線本身?
反斜線自身的轉義就是兩個反斜線:
\\ → \如果要顯示多個反斜線,就是成對使用:\\\\ → \\。
行末反斜線是什麼意思?
在行末加一個反斜線表示「軟換行」,相當於在下一行繼續當前段落,而不是新起一個段落:
這是一段很長的文字,\
但在渲染時它們會連在一起顯示。這個用法來自 CommonMark 規範,在 GitHub、Obsidian、Typora 中都支援 [^1]。
表格裡怎麼顯示管道符?
在表格的儲存格中顯示管道符,用反斜線轉義:
| 命令 | 說明 |
|------|------|
| `a \|\| b` | 邏輯或運算 |或者把包含管道符的內容放在程式碼標記裡(行內程式碼或程式碼區塊),這樣也不需要手動轉義。
速查表
最後放一張速查表,方便需要的時候快速查找:
| 想顯示的字元 | 寫法 | 說明 |
|---|---|---|
\ | \\ | 反斜線 |
` | \` 或雙反引號包裹 | 反引號 | |
* | \* | 星號 |
_ | \_ | 底線 |
# | \# | 井號 |
+ | \+ | 加號 |
- | \- | 減號 |
. | \. | 句號 |
! | \! | 驚嘆號 |
[] | \[ \] | 方括號 |
() | \( \) | 圓括號 |
{} | \{ \} | 花括號 |
\| | \| | 管道符 |
< | < | HTML 實體 |
> | > | HTML 實體 |
相關內容
- Markdown 加粗語法 — 了解星號和底線的格式化功能
- Markdown 程式碼區塊 — 程式碼區塊語法詳解,天然的「免轉義區」
- Markdown 表格語法 — 表格中管道符的用法
- Markdown 連結語法 — 連結中方括號和圓括號的作用
[^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