原文:AI 输出中的 ** 是怎么来的:谈中文 Markdown 强调标记的渲染问题 作者:PlatyHsu 发布时间:2026-04-17 18:01(UTC+8) 说明:这里不做全文转载,只做摘要整理和少量引用;完整内容请回原站阅读。

最近看少数派这篇文章,刚好把一个平时经常见到、但很少认真追根溯源的问题讲透了:

为什么 AI 明明吐出了 Markdown 的 **,结果中文里的加粗却没有生效?

比如下面这种内容,我们大概都见过:

1
2
**重要:**请注意。
这是**「重要」**的内容。

看起来像是标准 Markdown,但不少渲染器最后会把 ** 原样显示出来,而不是变成粗体。

这篇文章讲了什么

原文的核心观点很简单:

  • 早年的原版 Markdown 规则其实比较“松”,很多中文场景下反而能正常加粗。
  • 现在更主流的实现,大多跟随 CommonMark 规范。
  • CommonMark 为了避免误判数学式、变量名等内容,引入了更严格的“贴合”规则。
  • 这套规则主要按英文的分词和标点习惯设计,对中文这种不依赖空格分词的文本并不友好。

所以问题不在 AI,也不在你写错了 **,而在于很多现代 Markdown 渲染器对“强调”这件事判断得更严格了。

为什么中文里更容易出问题

原文提到,CommonMark 在处理强调标记时,会判断一串 *_ 是否满足“左侧贴合”和“右侧贴合”。

说人话就是:

  • 开始的强调标记,后面最好直接跟文字,或者某些“起始型”标点。
  • 结束的强调标记,前面最好直接跟文字,或者某些“结束型”标点。

这套思路放在英文里比较自然,因为英文大量依赖空格来分隔词语和标点位置;但到了中文里,文字之间本来就没有空格,于是像中文冒号、书名号、引号这样的场景,就很容易让强调判断失败。

也就是说,下面这两种写法在不少 CommonMark 系实现里都可能失效:

1
2
**重要:**请注意。
这是**「重要」**的内容。

前者的问题在 ,后者的问题在 「」 这种中文标点环境。

原文给出的几种解决办法

1. 直接改用 HTML 标签

这是最直接、也最稳的办法:

1
2
<strong>重要:</strong>请注意。
这是<strong>「重要」</strong>的内容。

优点是稳定,缺点是写起来没有纯 Markdown 那么顺手。

2. 加空格,硬凑出 CommonMark 想要的边界

1
2
**重要:** 请注意。
这是 **「重要」** 的内容。

这样确实有机会让强调重新生效,但中文里硬塞空格通常不太好看,也不太自然。

3. 用零宽空格

原文给的办法里,我觉得这个最有意思。思路是插入 U+200B ZERO WIDTH SPACE,也就是零宽空格。

示意写法:

1
2
**重要:[ZWSP]**请注意。
这是**[ZWSP]「重要」[ZWSP]**的内容。

这里的 [ZWSP] 只是占位说明,实际字符本身是不可见的。它不占显示宽度,但可以帮助强调标记满足渲染器对边界的判断。

4. 如果你是开发者,直接补渲染器

如果你能控制 Markdown 渲染链路,那么最彻底的办法不是教育编辑人员怎么绕规则,而是直接修规则。

原文提到了 markdown-cjk-friendly 这类补丁思路:在解析强调标记时,把 CJK 字符视作一种可以帮助判断边界的上下文,从而修复中文环境下的强调失效问题。

这条路更适合站点、编辑器、知识库或 AI 产品的开发者。

我自己的记法

如果只是平时写博客、记笔记、整理 AI 输出,我会这样选:

  1. 要稳,就直接上 <strong>...</strong>
  2. 要兼顾可读性和原味 Markdown,可以试零宽空格。
  3. 如果是产品或工具链层面的问题,就别让用户背锅,直接改渲染器。

原文最后那句我很喜欢:“真正掷地有声的话是不需要靠吼的。”

放回中文写作里也确实成立。很多时候,与其在一堆句子里到处加粗,不如直接把句式、措辞和标点写清楚。

延伸链接