KernelRanch
返回文章列表

Markdown 的六个渲染陷阱:表格被拆、代码块错位、链接断掉

2026-11-10 #markdown#writing#documentation#cheatsheet

Markdown 语法很简单,但"写出来是好的、渲染出来是坏的"的情况不少。下面六个都是真实踩过的,附最小复现和修法。

1. 表格单元格里的竖线

| 命令 | 说明 |
|---|---|
| `a | b` | 管道 |

渲染出来表格会多出一列,因为反引号里的 | 照样被当成列分隔符。修法是转义:

| `a \| b` | 管道 |

这个问题在写 shell 管道、正则、SQL || 拼接时特别常见。

2. 列表里的代码块

````markdown

  1. 第一步:
echo hi

````

上面的写法会让代码块跳出列表,编号也断掉。正确做法是给代码块加缩进,与列表内容对齐:

````markdown

  1. 第一步:
   echo hi

````

不同渲染器对缩进要求略有差异,但 3 个空格通常安全。

3. front-matter 里的冒号

title: 部署:从零到上线

YAML 会把第二个冒号当成分隔符,解析失败或截断。值里含冒号、井号、引号时,一律加引号:

title: '部署:从零到上线'

同理,summary 里出现 # 也要引号包裹,否则被当成注释。

4. 全角空格与零宽字符

从网页或 IDE 复制中文内容时,很容易带进全角空格(U+3000)或零宽空格(U+200B)。它们肉眼看不见,但会让 grep 搜不到、代码块复制出去报错。

检查方法(Windows PowerShell):

Select-String -Path .\doc.md -Pattern "[\u3000\u200b\ufeff]"

5. 尖括号被当成 HTML

用 <div> 包裹内容

很多渲染器会把 <div> 当 HTML 标签吃掉,读者看到的只有"用 包裹内容"。要么放进反引号,要么转义:

用 `<div>` 包裹内容

写前端文档、XML 配置、泛型(List<T>)时都会碰到。

6. 链接里的空格与中文

[文档](my notes/readme.md)

路径含空格会断链。两种修法:

[文档](<my notes/readme.md>)
[文档](my%20notes/readme.md)

尖括号写法更易读,但并非所有解析器都支持,GitHub 与多数静态站生成器支持。

一份自检清单

检查命令或方法
表格列数是否一致数每行 `\` 的数量
代码块围栏是否成对统计 ``` 出现次数,应为偶数
是否有不可见字符正则搜 \u3000、\u200b、\ufeff
front-matter 能否解析用任意 YAML 解析器读一遍
链接是否可达渲染后点一遍,或跑链接检查脚本

小结

六个问题里,前三个(竖线、缩进、冒号)属于语法层面的坑,后三个(不可见字符、尖括号、空格)属于"看得见但想不到"。它们的共同点是:源文件看起来完全正常。

最省事的防线是发布前跑一次机器检查:围栏配平、表格列数、不可见字符。这三项能挡掉大部分渲染事故,人工只需检查内容本身。

数据来源与检索时间

检索时间 2026-11-10。

来源URL对应数据
CommonMark 规范https://spec.commonmark.org/0.31.2/表格外的块级语法、列表与代码块的缩进规则、HTML 块的处理方式
GitHub Docs《Basic writing and formatting syntax》https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax表格中竖线的转义、代码块围栏、链接中空格的写法
YAML 规范 1.2https://yaml.org/spec/1.2.2/标量中含冒号、井号时的引号要求

核验说明

  • 六个现象都在本机写这批文档时真实遇到过,第 1 条(竖线被拆)在本批 Markdown 的自动改写过程中造成过实际损坏,事后逐篇修复。
  • 不同渲染器(GitHub、静态站生成器、编辑器预览)对缩进与尖括号的处理不完全一致,文中给的是多数实现共同的行为;未逐一对每个渲染器做对照测试。