MarkDown 中文换行插入空格的问题

2018/07/28

MarkDown 中插入一个单独的换行符并不会导致内容换行 (行尾无空格), 因为它只是把

第一行
第二行

转换成了

<p>第一行
第二行</p>

最后的显示结果是 第一行 第二行, 即换行符被「显示为」空格. 这在显示英文内容的时候是没有问题的, 毕竟英语单词和句子之间需要插入空格. 然而对包括中文在内的 CJK 等语言来说问题就大了1, 这类语言在书写时字词之间不会用空格来分割, 此时这个自动加入的空格就是多余的. 这是 HTML 的一个历史遗留问题, 而且短期内估计也不会解决, 那么就只能在由 MarkDown 生成「最终的」 HTML 的过程中着手了.

HTML 后期处理

即对初步生成的 HTML 文件再进行后期处理, 删除多余的换行符. 这个分两种, 如果使用的 MarkDown 处理器预置或是有相应插件那自然最好, 实在不行也可以自己写脚本, 难度应该也不大, 可以利用正则表达式, 替换去掉两个中文字符之间的单个换行符.

这里提一下 Hugo 默认的 MarkDown 引擎 blackfrifay 就有一个插件 joinLines 好像是一位中国人贡献的, 只要在配置文件里加入如下部分即可

# 以 toml 格式为例
[blackfriday]
  extensions = ["joinLines"]  # 默认不开启任何插件

另外你也可以针对单个语言 (详见) 或是页面 (通过 front matter) 进行设置.

这种自行后期处理的方法虽然灵活性很强, 也不需要改变写作习惯, 但却要求 1. 你的发布平台/MD 解析器允许加载自定义脚本/插件 (印象中 GitHub Pages 就毙掉了), 或者 2. 你必须在写作的机子上搭建本地环境, 且只能将生成的 HTML 而非 MD 源文件发布.

换用半角标点符号

这个是我目前采取的方案, 但是可能随时回退, 毕竟我觉得全角标点符号和汉字搭配更有美感. 接着说说使用半角字符的好处.

首先, 完全不需要考虑工具、平台之间的兼容问题, 任何事情到了 ASCII 字符集上总是显得如此愉快呢~

其次, 编辑器的一些功能, 比如向前/后移动一个语义单位, 或是按 option/alt + delete 删除一个, 它们在实现中多半是以半角标点或是空格来作为最小语义之间的分隔. 所以中文内容就与之无缘了, 仅有部分本土化做的比较好的软件, 比如 Word, 才支持全角标点甚至是中文字词的分词删除. 使用半角标点符号可以帮我们稍微找回一些这种便利性.

第三个, 再也不用纠结中英文混排时的标点使用问题了, 哈哈哈哈.


  1. 虽然说可以采取同一段一直写不换行的方法, 但这样的话在做以行为单位的源码控制时会很蛋疼的…