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

參考來源