FormatArc 的 Markdown to HTML 轉換結果,展示跳脫與未跳脫符號的顯示差異FormatArc 的 Markdown to HTML 轉換結果,展示跳脫與未跳脫符號的顯示差異
作者: FormatArc 編輯部發布日期: 2026-09-02更新日期: 2026-09-02

Markdown 跳脫字元與特殊符號:原樣顯示方法【23 例實測】

* 開頭的行變成了項目清單。打了 # 價格清單 結果整行變成頁面標題。本來想寫 <version> 結果在預覽中消失了。這些都是 Markdown 把符號當成「格式指令」來解讀所產生的結果,而且完全不會有任何錯誤提示。本文說明如何跳脫符號讓它原樣顯示,並附上 4 個解析器實測 23 例的結果。

結論先行 — 在符號前面放一個反斜線

要顯示的特殊字元前面直接打一個反斜線 \。就這麼簡單。

\*這句話不會變成斜體\*

反斜線本身不會出現在畫面上。上面的範例會原樣顯示為 *這句話不會變成斜體*,包含首尾的星號。

如果想顯示反斜線本身,就寫兩個:\\

依症狀快速對照表

從「發生了什麼事」反推是哪個特殊字元造成的問題。以下全部是後述實測中確認過的症狀。

發生的問題原因修法
文字變成斜體或粗體*_ 包住了詞前面加 \*\_
整行變成標題行首有 # 加空白改成 \#
變成有序清單行首是「數字 + 句號」句號前加 \.,例如 1986\.
變成項目清單行首是 -*改成 \-\*
文字從畫面上消失<> 包住的詞改成 \<\>
表格儲存格被拆開或後半段消失儲存格內的管線符 |管線符前加 \(詳細見後述)

可以跳脫的特殊字元(32 種)

CommonMark 規定的 Backslash escapes在新分頁中開啟 條文明確指出:「Any ASCII punctuation character may be backslash-escaped」(任何 ASCII 標點符號都可以用反斜線跳脫)。對象是以下 32 個字元:

! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~

這個規則背後有兩個反面規則,絕大多數的意外都出在這裡。

  • 對象只有 ASCII 標點符號。英文字母或數字前面的反斜線只是原樣保留。同規定指出「Backslashes before other characters are treated as literal backslashes」,所以寫了 \n 不會變成換行,只會顯示反斜線加 n
  • 全形記號(「」或 ※ 等)本身就不會構成 Markdown 格式,所以不需要跳脫。前面加了反斜線反而會讓反斜線本身顯示出來

還有一點很重要:是否需要跳脫不只取決於字元本身,還取決於「出現的位置」。# 變成標題只有在行首且後面跟空白時,句子中間的 # 原本就是安全的。下一節的實測會具體確認這個邊界。

全形與半形記號的混同

繁體中文環境下有一個獨有的坑:全形記號與半形記號長得幾乎一樣,但 Unicode 編碼完全不同。全形星號 (U+FF0A)和半形星號 *(U+002A)在視覺上極度相似,但 Markdown 只認半形版本。

實務上會碰到幾種情況:

  • 從繁體中文輸入法切出來的星號可能是全形 。這個字元不是 ASCII 標點,Markdown 不會把它解讀為強調格式,所以不需要跳脫。但如果在文字編輯器中看不出全形與半形的區別,可能會以為「已經跳脫了」實際上根本沒有問題存在
  • 從英文文件或日文文件複製過來時,星號是半形 *,這時候會觸發強調格式,需要正常跳脫
  • 全形括號 (U+FF08、U+FF09)不會觸發任何 Markdown 格式。但半形括號 () 在某些語境下會配合其他字元構成連結語法

判斷方法很直接:不確定手邊符號是全形還是半形時,把文字貼到 Markdown to HTML 轉換器 看渲染結果。如果符號沒有被解讀為格式,說明它是全形版本,不需要跳脫。

實測 — 不跳脫會發生什麼、反斜線是否有效

關於 Markdown 跳脫的說明文很多,但「不跳脫時實際會發生什麼事」「反斜線在所有實作中是否真的有效」並附有驗證的資料很少見。所以把 23 個測試案例跑過 4 個實作。對象是 GitHub 正式解析器(透過 Markdown API)、marked 18.0.5、remark-gfm 4.0.1、以及不加擴展的嚴格 CommonMark(remark-parse 單獨使用)。測量大於 2026-08-26,重現腳本與原始資料在 repository 內的 scripts/benchmarks/markdown-escape-characters/

主要案例的結果:

輸入(實測字串)未跳脫的結果跳脫後的結果
Buy the *limited edition* today.變成斜體(4 個實作一致)\*limited edition\* 原樣顯示(4 個一致)
行首的 # price list變成 h1 標題(4 個實作一致)\# price list 原樣顯示(4 個一致)
行首的 1986. What a year.變成從 1986 開始的有序清單(4 個實作一致)1986\. What a year. 原樣顯示(4 個一致)
Replace <version> with 2.0<version> 從畫面上消失(4 個實作一致)\<version\> 正常顯示(4 個一致)
表格儲存格內的 grep a | b管線符把儲存格拆開,超過標題列數的部分被丟棄(GFM 系 3 個實作一致)反斜線前置後保持在單一儲存格內(GFM 系 3 個一致)

「數字 + 句號」的清單化是特別容易被忽略的意外。不管是 1. 還是 1986.,只要出現在行首就會被解讀為有序清單,後續文字會被縮排。如果句子開頭是年份或型號,記得把句號跳脫成 \.

寫好的 Markdown 會被解析器怎麼解讀,貼到轉換器就能即時確認,貼上的內容不會上傳到任何地方。

FormatArc 的 Markdown to HTML 轉換結果,展示跳脫與未跳脫符號的顯示差異FormatArc 的 Markdown to HTML 轉換結果,展示跳脫與未跳脫符號的顯示差異

附帶一提,這 4 個實作都是 CommonMark 系,跳脫的基本行為完全一致。各實作之間的方言差異出在哪裡是另一回事,詳見CommonMark 與 GFM 的差異

其實不需要跳脫的情況

過度跳脫會降低原始碼的可讀性,也會在 diff review 中製造雜訊。實測確認「不需要跳脫」的代表案例有 3 個:

  • 詞語內的底線。max_retry_count_limit 這種 snake_case 在 4 個實作中全部原樣顯示。詞中間的 _ 不會被解讀為強調
  • 沒有空白的 #hashtag# 後面有空白才會變成標題,#hashtag 在 4 個實作中全部只是普通字串
  • 沒有接 URL 的方括號。[TODO] 之後再修 這樣的寫法在 4 個實作中全部原樣顯示。但如果在文件某處寫了 [TODO]: https://... 這種參考連結定義,方括號就會變成連結,那種情況才需要 \[TODO\]

要注意的是,星號跟底線的行為不對稱。foo*bar*baz 這種詞內的星號在 4 個實作中全部變成了斜體。用 snake_case 的直覺去對待星號就會出問題。

反斜線無效的地方

CommonMark 規定明確指出:「Backslash escapes do not work in code blocks, code spans, autolinks, or raw HTML」(反斜線跳脫在程式碼區塊、程式碼片段、自動連結、raw HTML 內不起作用)。實測中,程式碼片段和程式碼區塊內寫的 \* 在 4 個實作中全部連同反斜線一起顯示了。

這對實務上有兩個重要意義:

  • 程式碼區塊內不需要跳脫任何東西。*# 原樣寫就會原樣顯示
  • 在程式碼中嘗試跳脫反而會壞掉。寫了 `\*` 讀者看到的是 \* 而不是 *

還有一個行末的陷阱。規定上「A backslash at the end of the line is a hard line break」(行末的反斜線是強制換行),實測中 4 個實作全部把行末的 \ 轉成了 <br>。如果本意是跳脫行末的符號但把反斜線放在最後面,得到的不是符號而是多一行的換行。

會消失的字元 — 尖括號 < > 要特別小心

其他符號是「被加上非預期的格式」,但 <> 是讓文字整個消失的方向壞掉的。如果有把 placeholder 寫成 <version> 的習慣,這個坑很容易踩到。

實測中,Replace <version> with 2.0 這一行的 <version> 在 4 個實作中全部從畫面上不見了。消失的方式因實作而異。GitHub 是 sanitizer 把未知 tag 移除所以從正文中消失,marked 和 remark 是原樣輸出為 raw HTML tag 然後被瀏覽器當作未知 tag 吃掉了。無論哪條路徑,讀者都看不到。

修法有三種:

Replace \<version\> with 2.0
Replace `<version>` with 2.0
Replace &lt;version&gt; with 2.0

\<version\> 在 4 個實作中全部作為含尖括號的文字正常顯示。如果想讓讀者知道這是命令或程式碼的一部分,用程式碼片段包起來更能傳達意圖。HTML 字元參考 &lt;version&gt; 在 4 個實作中也全部保留了(remark 系輸出時會正規化為 &#x3C;,但畫面上看起來一樣)。跟後述表格儲存格的管線符用 &#124; 是同一種手法。

全文唯一例外 — 表格儲存格內的管線符特別

到這裡為止的規則在文件任何地方都適用,但表格儲存格內的管線符 | 是唯一例外。表格不是 CommonMark 核心而是 GFM 擴展規定在新分頁中開啟,儲存格內如果有未跳脫的管線符就會在那裡分列。而且 GFM 規定把超過標題行列數的儲存格視為「the excess is ignored」(超出部分忽略),實測中寫了 grep a | b 的儲存格在管線符位置被拆開後,後半段的 b 被靜默丟棄了(GFM 系 3 個實作一致)。從資料會靜默消失的層面來看,這個意外跟其他格式錯誤性質不同。

儲存格內的管線符用反斜線前置跳脫,或用 HTML 字元參考 &#124; 表示。實測中兩種方法在 GFM 系 3 個實作中都能把管線符保持在單一儲存格內。

| 命令 |
| --- |
| grep a \| b |
| grep a &#124; b |

如果表格是從 CSV 或試算表資料產生的,用 CSV to Markdown 轉換器 可以自動跳脫儲存格內的管線符。不需要逐個儲存格肉眼檢查,轉換在瀏覽器內完成。

想當作程式碼顯示就用程式碼片段包起來

除了反斜線之外,用程式碼片段(backtick 包住)也能讓特殊字元原樣顯示。但用途區分要明確:

  • 想在文章中展示符號本身時用反斜線。像 價格是 \*不預告\* 會變動的 這樣寫,保持正文的自然排版,只讓符號顯示出來
  • 想展示程式碼、命令、檔案路徑、正規表示式時用程式碼片段。C:\Users\name\d+ 這種字串用等寬字體顯示,對讀者來說「這是程式碼」的意圖更明確

程式碼片段內部跳脫處理本身就不起作用,所以正規表示式的 \d+ 可以原樣寫,這是很大的優勢。既有 HTML 轉為 Markdown 時跳脫的處理方式不同,可參考HTML 轉 Markdown 指南

寫入的平台不同,反斜線可能無效

到目前為止的實測對象是 4 個 Markdown 解析器,但實際寫文章的平台可能是 Slack 或 Notion 這類協作工具,它們需要跟解析器分開對待。整理各服務官方文件中確認到的範圍:

寫入的平台\ 跳脫支援確認到的官方依據
GitHub(.md / Issue / PR)支援本文實測(GitHub Markdown API)與 GFM 規定在新分頁中開啟
GitLab支援GitLab 官方文件在新分頁中開啟 列舉 31 個保留 ASCII 字元
Obsidian支援Obsidian 官方說明在新分頁中開啟 明記 \*\_\#\`|\~
Slack不支援Slack 官方文件在新分頁中開啟 只規定 &<> 的 HTML entity,未提及反斜線
Notion官方文件未提及Notion 官方說明在新分頁中開啟 說明 ***`~ 快捷鍵但沒有跳脫項目

由此可以得出兩點:

  • GitHub、GitLab、Obsidian 的跳脫行為有官方文件背書,與解析器實作一致。前文的實測表直接適用
  • Slack 需要用別的方法。Slack 的跳脫規定只有 &<> 的 HTML entity,*_ 用反斜線取消的方法是沒有文件化的。想確保符號原樣顯示,用 backtick 做成程式碼片段是實務上可行的對策

Notion 因為官方說明沒有跳脫相關記載,所以沒有標「支援」或「不支援」。把沒有文件化的行為用一次實測就下定論,一旦產品改了規格就會變成錯誤資訊。Discord 也是候選,但官方文件無法取得,所以沒列入表中。

常見問題

Markdown 中哪些特殊字元可以跳脫?

ASCII 標點符號 32 種全部(CommonMark 規定在新分頁中開啟)。英文字母、數字或全形記號前面的反斜線不會構成跳脫,反斜線本身會當作文字保留。

寫了 \n 但沒有換行

\n 是程式語言的換行記法,不是 Markdown 的跳脫。反斜線 + 英文字母會原樣顯示(4 個實作實測一致)。要在 Markdown 中換行,用空白行分段,或在行末放反斜線做強制換行。

snake_case 的底線需要跳脫嗎?

不需要。詞內的 _ 在 4 個實作中全部不會被解讀為強調。但星號是例外,foo*bar*baz 即使在詞內也會變成斜體。

表格儲存格內的管線符怎麼跳脫?

管線符前放反斜線寫成 \|,或用字元參考 &#124;。實測中兩種方法在 GFM 系 3 個實作中全部有效。從 CSV 產生表格時,CSV to Markdown 轉換器會自動跳脫。表格的對齊、儲存格內換行等語法,詳見Markdown 表格語法

程式碼區塊中想顯示反斜線或特殊符號怎麼辦?

什麼都不用做。程式碼區塊和程式碼片段內部跳脫處理不起作用,*\ 原樣寫就會原樣顯示。反而寫了 \* 會連反斜線一起顯示。

總結

  • 符號原樣顯示的基本原則:前面放一個反斜線 \。對象是 32 種 ASCII 標點符號,英文字母和數字不適用
  • snake_case、#hashtag、沒有接 URL 的方括號不需要跳脫。全形記號也不需要,但全形與半形混用時要確認實際是半形版本才需要跳脫
  • 程式碼區塊和程式碼片段內跳脫不起作用。行末的反斜線是強制換行
  • <> 會讓文字消失,表格儲存格內的管線符會讓資料遺失。這兩項要優先處理

想確認寫好的 Markdown 會怎麼顯示,貼到 Markdown to HTML 轉換器就能即時確認。免費、不需註冊、貼上的內容不會離開瀏覽器。