起因

以前没有考虑过文字表达与排版的规范化问题,只是觉得看得懂没有歧义就好。写一段时间博客以后,好像也不自觉地养成了中文和英文之间加空格的习惯,大概是因为看着美观。我注意到,大部分中文个人博客都会采用这种方式来处理中西文以及数字混排的问题。对于我来说,这样的手动排版已经成为肌肉记忆了,就像写代码时打a = b[1, 2, 3]这些部分时手动加空格一样自然。

至于为什么又想到这个问题,只是因为修改以前的文章时注意到省略号和引号的问题,于是上网搜索一下。接着就顺便看到了关于空格问题的讨论,原来一直以为加一定比不加好,原来并非如此。那么就顺带研究一下好了。

这个问题的答案并非只是加或不加那么简单。在不同的语境下,要考虑的因素很多。例如下面这段话,其中英文与数字两侧已经全部加上空格了;按照个人习惯,你会选择如何添加空格?

虽然现在已经是 2023 年了,但是我还是不会使用 Adobe Photoshop 处理图片。不过,我使用 GIMP 2.0 的 P 图水平比 B 站上那个叫沧域的 UP 主强。另外,这个 16 GB 的 U 盘里存有我自己用 C 语言写的图像处理软件,代码开源在 GitHub 上了。

探究

中西文混排

是否加空格,和用“弯引号”还是「直角引号」,省略号用三点还是六点、居中还是靠下这类问题一样,其实是无可厚非的个人偏好问题,也是一个无关紧要的细节问题。在网上表达不必那么严苛,毕竟不是正式出版物,大家只是遵循各自的习惯。所有我接下来的探究仅代表个人的喜好。

不过不妨先参考一下出版物的相关标准:

CY/T 154—2017 中文出版物夹用英文的编辑规范
8.1 中文文本中夹用英文词句时,应根据所选用的中英文字体、字符间距以及排版的视觉效果决定英文词句与中文文字之间是否留有空格间距。如留空格,应保证体例的统一。

这个表达好像有点含糊,我的理解是只要易于辨认且美观即可。这就是每个人的主观感受了。

除了加不加空格之外,还有间距多少的问题,因为半角空格的间距有时并不合适。在维基百科的空格词条有很多种空格字符,它们的显示效果各有不同,以及同一个字符在不同的软件或是字体中展现出的具体效果也是不一样的。我在 GIMP 中做了个视觉效果对比:

空格宽度对比

这是带有栅格的对比:

带有栅格的空格宽度对比

汉字之间是没有空格的,在这种情况下中间插入的英文里的空格就格外扎眼。如上图所示,若是没有空格,整个短语像是被空格分成两个部分,感觉就是“安装 Windows / Vista 系统”,因此间隔是必要的。

手动加空格不是目的是手段,只是一种妥协,因为支持中西文自动间距的平台很少,比如说 iOS 原生应用和 Microsoft Word。那么解决了空格的问题,第二个问题也随之而来:间距多少合适?

若是用太宽的空格,看起来好像又是在强调中间的英文内容。本例中可能不太明显,因为其中的英文内容是一个整体的特殊名词。如果是中英文都有的名词呢?

中英文混杂的名词

带普通空格的视觉效果就是“那个人 / 的 / T / 恤上 / 印着 /‘ISLANDERS’”,将一个完整的名词拆开了。

在我看来六分之一空格间距较合适。但是有几个问题:不能在常规键盘上直接打出,不方便输入(这也是我不使用直角引号的其中一个原因);在对空格要求严格的场景(如程序代码),直接粘贴容易出错;受字体和影响太大,宽度不能统一。

总结

在中文之间插入西文,需要间隔,且宽度在 1/6 em 到 1/5 em 之间最为合适。

在支持自动排版中西文的平台中不用手动加入空格,无需对各种情况分类考虑。

在不支持此特性的平台或需要考虑通用性,一般情况下手动插入半角空格(U+0020)。插入空格时需要考虑分词习惯,若遇到中西文混杂的词,在不影响易读性的前提下优先考虑不加空格。

数字与单位之间

可以参考国际计量局的标准:

SI Brochure - BIPM
5.4.3 Formatting the value of a quantity The numerical value always precedes the unit and a space is always used to separate the unit from the number. Thus the value of the quantity is the product of the number and the unit. The space between the number and the unit is regarded as a multiplication sign (just as a space between units implies multiplication). The only exceptions to this rule are for the unit symbols for degree, minute and second for plane angle, °, ′ and ″, respectively, for which no space is left between the numerical value and the unit symbol.

(笔者译)数字总是在单位之前,并且单位和数字间总是用空格分隔。因此,物理量的值是数字与单位的乘积。数字和单位之间的空格应该被视作一个乘号(就像单位之间的空格意味着相乘)。唯一例外的单位符号是平面角的度(°)、分(′)和秒(″),它们与数字之间不需要空格。

这个标准中没有特殊规定百分号,那就是说百分号之前应该按照默认情况加空格;不过按照日常习惯我倾向不加空格。因此我的总结是,除了百分号(%)和度分秒(°′″),数字后面跟的其他单位都需要加空格,像这样:

这块存储容量为 500 GB 的硬盘应该工作在相对湿度 20% 以上、温度不高于 40 ℃ 的环境 。水平放置时与地面倾角不大于 10°。

中文与数字之间

我认为,数字与中文之间也应该保持与插入西文一样的间隔,即 1/6 em 到 1/5 em。如果平台支持自动排版,则在任何情况下都保持一定间隔,无需更改。

当数字需要与后面的单位等连缀才有明确意义时,不加空格。例如:

海拔8848米
价值19.19亿元
2006年1月2日15时04分05秒

当数字相对上下文独立成词时,需要加入空格。例如:

他的 QQ 号是 337845818。
数字 114514 是“逸一时,误一世”的谐音。

实践

于是我花了好一段时间来处理博客上自动间隔的问题。所以,你现在看到的这篇文章应该已经经过自动排版了。在后端我并没有替换、增加任何空格,而是将插入的西文和数字放入一个单独的 span,用 class 字段标记间隔,这样用户复制下来的文本也会在合适的地方带有空格作为间距,这样算是一个 fallback。比如说这段文本处理后会变成这样:

原始文本:这个U盘里存有 Windows 10 的镜像。
              ~~~      ~~~~~~~~~~~~
             无空格       有空格
处理后:这个<span class="left-spacing right-spacing">U</span>盘里存有<span class="left-shrinking right-shrinking"> Windows 10 </span>的镜像。

然后用 CSS 处理。下面只是个简单的例子,实际上可以根据不同字体调整:

/* 没有空格时,添加 1/6 em 的边距。 */
.left-spacing {
	margin-left: 0.16em;
}
.right-spacing {
	margin-right: 0.16em;
}
/* 已有空格时,由于原本的空格宽度约为 0.37 em,使用负边距将间隔缩至 1/5 em。*/
.left-shrinking {
	margin-left: -0.17em;
}
.right-shrinking {
	margin-right: -0.17em;
}

渲染效果:这个U盘里存有 Windows 10 的镜像。

参考

以下链接无先后顺序。