与其他常用标点符号一样,破折号也是在十九世纪末二十世纪初现代中文新式标点符号形成过程中从西文引入的一个符号,与其关系最为密切的,当属西文里的半角连接号 en dash (–) 和全角连接号 em dash (—)。这其中具体的演变历史甚为复杂,远超本文所能论述的范围,但基本上可以笼统地说,由于汉字面积比西文大得多,在上世纪初将西文符号引入中文时,都按「半身」「全身」的倍数关系,将包括空格在内的很多符号放大了一倍。这样不仅与方块汉字更搭配,而且,拉长后的破折号还能预防横排时与汉字数字「一」、直排时与「丨」(竖)混淆。于是一个「占两个字宽」的符号就这样逐渐在现代中文里稳定下来。经过岁月变迁,随着中文标点符号的格式与使用方法日趋规范,时到今日,连小学的语文教学里都会说,破折号应该是「占两格的一条横杠」。目前,在中华人民共和国的推荐国标 GB/T 15834-2011《标点符号用法》里,相关记述如下:
东亚各地区的标准化机构在上世纪七八十年代陆续为各自地区的字符制作了字符集编码,比如日本工业标准有 1978 年发布的 JIS C 6226(现已改为 JIS X 0208)、中国大陆国标有 1980 年发布的 GB-2312、港台还有 1983 年发布的大五码(BIG5)等等。查阅中文编码初创期的资料可以发现,在 1980 年版的 GB-2312 里,1-10 区位上的符号名称即是「破折号」。而事实上这个 GB 标准几乎是照搬了日本 JIS C 6226 的结构和顺序,这其实为后来 Unicode 映射错误埋下的隐患。但最重要的是,这个符号虽然名叫破折号,但明显是一个只有一个汉字字宽、所谓「全角」的字符。出于早期的计算机功能限制,在编码当初就已经决定要用这样一个所谓的全角符号去拼接破折号的做法。
从用法来说,Unicode 里与破折号关系最近的似乎应该是「全角连接号」 U+2014 EM DASH,这也是目前大部分实作的「事实标准」。显然,这个码位要表示的原本是一个西文的标点,拿到中文里用首先会导致中西文标点共用同一个码位的问题,实际显示效果往往会根据不同字体而异。正如前文所说,一般的西文字体里由于要与拉丁小写字母配套设计,横杠位置会水平偏下,显然不符合中文破折号的需求。当然,中文字体厂商则会在这同样的码位上放上一个水平居中的横杠,用户必须选择中文字体才能正常显示。这种中西文标点共用码位的情况并不仅限于破折号,它与蝌蚪引号(“”)等符号一样,总是会在中西混排时引发很多麻烦,在此就不多展开了。
再来看看这个码位旁边的那个叫「横杠」U+2015 horizontal bar 的字符。在《Unicode 核心标准》第 6.1 章里明确写到它「在一些字体排印风格里用于引出一段引文」,而码表里也明确注明 2015 HORIZONTAL BAR = QUOTATION DASH,这个用法也是中文破折号的用法之一,从用途上说,这个码位也可以拿来用作破折号。
作为东亚字符编码的先驱,JIS 本身曾经有过一段乌龙。JIS X 0208 及 JIS X 0213 字符集在 1 面 1 区 29 点里安排了一个「连接号(全角)」,并定义其在 Unicode 的对应名称为 EM DASH。按照这个名称,理论上就应该是 Unicode 里的 U+2014。然而后来的 JIS X 0213:2000 却错误地将这个符号映射到了 U+2015,直到 2001 年 5 月才发布《勘误表》急忙订正回来,直到后来 2004 年 JIS X 0213 修订的时候才终于回到所谓正确的 U+2014,风波告一段落。
无独有偶,Unicode 联盟早年在其 FTP 网站上提供的「非规范」信息里也曾把 Shift_JIS 中 0x815C「连接号(全角)」映射到了 Unicode 的 U+2015 码位上。虽然目前这个文件已经被官方声明过期,但使用这个实作的程序时到今日依然存在。微软公司在 Windows XP 使用的代码页 CP932 里也保留了同样的 Unicode 映射。而苹果公司针对 Shift_JIS 的 MacJapanese 编码以及微软 Windows Vista 之后的 CP932 则已经改回到 U+2014 上。
其实,西文的字体排印也存在多个宽度的横杠符号,随着后来计算机性能的提高和文字编码工作的深入,这些符号也相继被收入到 Unicode 里,比如我们可以看到在 U+2E00 – U+2E7F 的「增补标点符号」 (Supplemental Punctuation) 区块里就有 U+2E3A TWO EM DASH(两倍接连号,即「⸺」) 和 U+2E3B THREE EM DASH(三倍接连号,即「⸻」)。
既然中文破折号是一个占两个字宽的符号,那么选用 U+2E3A TWO EM DASH 似乎应该是合情合理的一个选择。然而,Unicode 里最符合逻辑的码位并不一定是最常用的。但这个码位来的太晚,早年打字的习惯已经无法修改,从中国大陆绝大多数的软件实作以及用户习惯并没有用 U+2E3A TWO EM DASH 这一个字符,而是依旧采用两个映射到 U+2014 EM DASH 拼接成一个破折号。显而易见,这不仅无法满足上述的破折号第一需求,而且还为断开等问题留下了后患。在日常生活中,这样的实作唯一一个好处似乎是,歪打正着地可以让用户可以方便输入中文连接号的「一字线」。包括笔者在内的用户,有时候在中文状态下无法方便地输入「一字线」,所以干脆先打一个破折号,再回头删除一格。
我们也可以呼吁各种排版引擎考虑增加对中文的需求,但是这个需求是什么、如何实现才合理,需要认真定夺。比如,如果单纯设置将两个 U+2014 自动替换成一个 U+2E3A TWO EM DASH,这依旧需要字库的支持。否则,好不容易换到了 U+2E3A TWO EM DASH 而字库厂商却又没有绘制这个码位的字形,会导致字符无法正常显示,用户就会看到「豆腐」或者干脆什么都没有。退一步来说,如果这样的替换处理不是在文本处理,而是在字体层面利用 OpenType 的 GSUB 特性就解决掉,那么排版引擎方面就要把工作重心转移到「全面支持 OpenType 特性」上了。从这一点我们也可以看出,字体排印处理是环环相扣、相辅相成的,一个环节出问题都会掉链子,而在哪个层级处理问题,需要对整个环节有正确理解的基础上再做判断。
先来看看常用于屏幕显示的黑体。从上图罗列出了一些常见的黑体可以看到,针对目前最常用的 U+2014 EM DASH 这个码位,大部分厂商都将字形制作成位于水平中央、左右撑满的横杠,保证了连用不断开,满足破折号的前两个要求。而对于 U+2015 horizontal bar 这个码位的字形,大部分字体里的字形左右留空,因此两个连用时会断开。只有「苹方」将这两个字符的字形都做成了左右撑满,粘在了一起,但似乎用了不同的粗度加以区分。「华文黑体」这样的老派泛用黑体字库里,汉字「一」、U+2014、U+2015 三者的粗细都不一样,加大了区别度。当然,在现代字库「多字重」的家族展开里,针对「不同字重下的标点粗度是否应该随字重的变化而变化」这个课题,各个厂家有着不同的解答。比如方正「兰亭黑 H」的 U+2014 EM DASH 明显按照 H 字重加粗了,但 U+2015 却依旧非常细。另外,旧版微软雅黑里的符号依然「不走寻常路」,U+2014 的字形不仅位置下沉,两个连用时长度居然还超过两个字宽,而又把 U+2015 horizontal bar 做成上浮横线,实在令人哭笑不得。
在 Adobe InDesign 中文版默认的「简体中文避头尾」设置里,U+2014 EM DASH 已被放入「禁止在行首的字符」,也就是说,如果采用默认设置即会变成「严式」风格,对破折号进行避头处理。了解这个默认设置很重要,而需要「宽式」风格的用户可以根据需要自定义修改。
对于非设计专业的一般用户来说,需要特别注意的是微软 Word 软件的默认设置。在 Word 默认设置里「后置标点」(即避头符号)里有一个看似破折号的符号「―」,但它并不是目前大多数中文输入法采用的「—」 U+2014 EM DASH,而是 U+2015 HORIZONTAL BAR。按照这个设置,用户输入 U+2014 EM DASH 破折号时, Word 并不会对其进行避头尾处理。如果想针对破折号进行避头尾操作,笔者建议用户通过「自定义」手动添加 U+2014 EM DASH 这个符号。这个问题的根源就是本文在第二章第二节里提到的字符映射发生过修改而产生的历史问题。无论问题来源是什么,在实务操作层面,如果要确保对破折号进行避头尾处理控制,还是将两个字符都加入避头尾定义表里最为稳妥。
事实上,InDesign 里「字符」面板选项菜单的「不换行」原本是为西文排版准备的。在英文原版里,这个选项菜单写作 No Break,用户选择任意几个字符,再勾选这个选项之后就可以保证不会在此断开。显然这是局部的、手动指定,并不具有普适性。虽然中文破折号,也可以这样手动选择后勾选「不换行」,但如果全篇文档有十几个破折号,就必须一一手动选择进行设置,非常麻烦。
这个「禁止断字」是 Adobe 为东亚排版而设置的功能,或者应该严格地说,这是为了实现日本 JIS X 4051「分离禁止」处理而设置的功能。翻阅 JIS X 4051 原文可以知道,日文排版所谓「分离禁止」是指字符之间不能断开,且在标点挤压等间距调整处理时也不被拉开;具体对象有破折号、省略号、「连数字」、西文单词等。显然,与「不换行」单纯功能相比,这个需求更突出了「在标点挤压等各种间距调整处理时也不被拉开」的重要性。如果忘记定义,破折号的两个字符之间在两端对齐调整字距时依旧有被断开的危险。因此,即使决定要采用「宽式」风格不避头尾,在「避头尾规则集」对话框上方里的「禁止在行首的字符」里删除掉相关字符,但依然要记着把所有这些相关字符(为了保险,建议把 U+2014、U+2015、U+2500 等等)都写入底部「禁止分开的字符」定义表里,保证「避中间」,不至于连用时从中间断开。
《芝加哥风格手册》(The Chicago Manual of Style,第 17 版)第 6.83 节指出:「按英国用法,在长文中,比起 em dash 通常更偏好使用一个 en dash(前后加空格);也有一些非英国出版社追随这种方法。」而在《新牛津风格手册》(New Oxford Style Manual, 2016 版)第 4.11.1 节中也指出「很多英国出版社用 en rule 前后加空格作为插入用的 dash 符号,但是牛津风格和大部分美国出版社使用 em rule。」↩︎
与其他常用标点符号一样,破折号也是在十九世纪末二十世纪初现代中文新式标点符号形成过程中从西文引入的一个符号,与其关系最为密切的,当属西文里的半角连接号 en dash (–) 和全角连接号 em dash (—)。这其中具体的演变历史甚为复杂,远超本文所能论述的范围,但基本上可以笼统地说,由于汉字面积比西文大得多,在上世纪初将西文符号引入中文时,都按「半身」「全身」的倍数关系,将包括空格在内的很多符号放大了一倍。这样不仅与方块汉字更搭配,而且,拉长后的破折号还能预防横排时与汉字数字「一」、直排时与「丨」(竖)混淆。于是一个「占两个字宽」的符号就这样逐渐在现代中文里稳定下来。经过岁月变迁,随着中文标点符号的格式与使用方法日趋规范,时到今日,连小学的语文教学里都会说,破折号应该是「占两格的一条横杠」。目前,在中华人民共和国的推荐国标 GB/T 15834-2011《标点符号用法》里,相关记述如下:
东亚各地区的标准化机构在上世纪七八十年代陆续为各自地区的字符制作了字符集编码,比如日本工业标准有 1978 年发布的 JIS C 6226(现已改为 JIS X 0208)、中国大陆国标有 1980 年发布的 GB-2312、港台还有 1983 年发布的大五码(BIG5)等等。查阅中文编码初创期的资料可以发现,在 1980 年版的 GB-2312 里,1-10 区位上的符号名称即是「破折号」。而事实上这个 GB 标准几乎是照搬了日本 JIS C 6226 的结构和顺序,这其实为后来 Unicode 映射错误埋下的隐患。但最重要的是,这个符号虽然名叫破折号,但明显是一个只有一个汉字字宽、所谓「全角」的字符。出于早期的计算机功能限制,在编码当初就已经决定要用这样一个所谓的全角符号去拼接破折号的做法。
从用法来说,Unicode 里与破折号关系最近的似乎应该是「全角连接号」 U+2014 EM DASH,这也是目前大部分实作的「事实标准」。显然,这个码位要表示的原本是一个西文的标点,拿到中文里用首先会导致中西文标点共用同一个码位的问题,实际显示效果往往会根据不同字体而异。正如前文所说,一般的西文字体里由于要与拉丁小写字母配套设计,横杠位置会水平偏下,显然不符合中文破折号的需求。当然,中文字体厂商则会在这同样的码位上放上一个水平居中的横杠,用户必须选择中文字体才能正常显示。这种中西文标点共用码位的情况并不仅限于破折号,它与蝌蚪引号(“”)等符号一样,总是会在中西混排时引发很多麻烦,在此就不多展开了。
再来看看这个码位旁边的那个叫「横杠」U+2015 horizontal bar 的字符。在《Unicode 核心标准》第 6.1 章里明确写到它「在一些字体排印风格里用于引出一段引文」,而码表里也明确注明 2015 HORIZONTAL BAR = QUOTATION DASH,这个用法也是中文破折号的用法之一,从用途上说,这个码位也可以拿来用作破折号。
作为东亚字符编码的先驱,JIS 本身曾经有过一段乌龙。JIS X 0208 及 JIS X 0213 字符集在 1 面 1 区 29 点里安排了一个「连接号(全角)」,并定义其在 Unicode 的对应名称为 EM DASH。按照这个名称,理论上就应该是 Unicode 里的 U+2014。然而后来的 JIS X 0213:2000 却错误地将这个符号映射到了 U+2015,直到 2001 年 5 月才发布《勘误表》急忙订正回来,直到后来 2004 年 JIS X 0213 修订的时候才终于回到所谓正确的 U+2014,风波告一段落。
无独有偶,Unicode 联盟早年在其 FTP 网站上提供的「非规范」信息里也曾把 Shift_JIS 中 0x815C「连接号(全角)」映射到了 Unicode 的 U+2015 码位上。虽然目前这个文件已经被官方声明过期,但使用这个实作的程序时到今日依然存在。微软公司在 Windows XP 使用的代码页 CP932 里也保留了同样的 Unicode 映射。而苹果公司针对 Shift_JIS 的 MacJapanese 编码以及微软 Windows Vista 之后的 CP932 则已经改回到 U+2014 上。
其实,西文的字体排印也存在多个宽度的横杠符号,随着后来计算机性能的提高和文字编码工作的深入,这些符号也相继被收入到 Unicode 里,比如我们可以看到在 U+2E00 – U+2E7F 的「增补标点符号」 (Supplemental Punctuation) 区块里就有 U+2E3A TWO EM DASH(两倍接连号,即「⸺」) 和 U+2E3B THREE EM DASH(三倍接连号,即「⸻」)。
既然中文破折号是一个占两个字宽的符号,那么选用 U+2E3A TWO EM DASH 似乎应该是合情合理的一个选择。然而,Unicode 里最符合逻辑的码位并不一定是最常用的。但这个码位来的太晚,早年打字的习惯已经无法修改,从中国大陆绝大多数的软件实作以及用户习惯并没有用 U+2E3A TWO EM DASH 这一个字符,而是依旧采用两个映射到 U+2014 EM DASH 拼接成一个破折号。显而易见,这不仅无法满足上述的破折号第一需求,而且还为断开等问题留下了后患。在日常生活中,这样的实作唯一一个好处似乎是,歪打正着地可以让用户可以方便输入中文连接号的「一字线」。包括笔者在内的用户,有时候在中文状态下无法方便地输入「一字线」,所以干脆先打一个破折号,再回头删除一格。
我们也可以呼吁各种排版引擎考虑增加对中文的需求,但是这个需求是什么、如何实现才合理,需要认真定夺。比如,如果单纯设置将两个 U+2014 自动替换成一个 U+2E3A TWO EM DASH,这依旧需要字库的支持。否则,好不容易换到了 U+2E3A TWO EM DASH 而字库厂商却又没有绘制这个码位的字形,会导致字符无法正常显示,用户就会看到「豆腐」或者干脆什么都没有。退一步来说,如果这样的替换处理不是在文本处理,而是在字体层面利用 OpenType 的 GSUB 特性就解决掉,那么排版引擎方面就要把工作重心转移到「全面支持 OpenType 特性」上了。从这一点我们也可以看出,字体排印处理是环环相扣、相辅相成的,一个环节出问题都会掉链子,而在哪个层级处理问题,需要对整个环节有正确理解的基础上再做判断。
先来看看常用于屏幕显示的黑体。从上图罗列出了一些常见的黑体可以看到,针对目前最常用的 U+2014 EM DASH 这个码位,大部分厂商都将字形制作成位于水平中央、左右撑满的横杠,保证了连用不断开,满足破折号的前两个要求。而对于 U+2015 horizontal bar 这个码位的字形,大部分字体里的字形左右留空,因此两个连用时会断开。只有「苹方」将这两个字符的字形都做成了左右撑满,粘在了一起,但似乎用了不同的粗度加以区分。「华文黑体」这样的老派泛用黑体字库里,汉字「一」、U+2014、U+2015 三者的粗细都不一样,加大了区别度。当然,在现代字库「多字重」的家族展开里,针对「不同字重下的标点粗度是否应该随字重的变化而变化」这个课题,各个厂家有着不同的解答。比如方正「兰亭黑 H」的 U+2014 EM DASH 明显按照 H 字重加粗了,但 U+2015 却依旧非常细。另外,旧版微软雅黑里的符号依然「不走寻常路」,U+2014 的字形不仅位置下沉,两个连用时长度居然还超过两个字宽,而又把 U+2015 horizontal bar 做成上浮横线,实在令人哭笑不得。
在 Adobe InDesign 中文版默认的「简体中文避头尾」设置里,U+2014 EM DASH 已被放入「禁止在行首的字符」,也就是说,如果采用默认设置即会变成「严式」风格,对破折号进行避头处理。了解这个默认设置很重要,而需要「宽式」风格的用户可以根据需要自定义修改。
对于非设计专业的一般用户来说,需要特别注意的是微软 Word 软件的默认设置。在 Word 默认设置里「后置标点」(即避头符号)里有一个看似破折号的符号「―」,但它并不是目前大多数中文输入法采用的「—」 U+2014 EM DASH,而是 U+2015 HORIZONTAL BAR。按照这个设置,用户输入 U+2014 EM DASH 破折号时, Word 并不会对其进行避头尾处理。如果想针对破折号进行避头尾操作,笔者建议用户通过「自定义」手动添加 U+2014 EM DASH 这个符号。这个问题的根源就是本文在第二章第二节里提到的字符映射发生过修改而产生的历史问题。无论问题来源是什么,在实务操作层面,如果要确保对破折号进行避头尾处理控制,还是将两个字符都加入避头尾定义表里最为稳妥。
事实上,InDesign 里「字符」面板选项菜单的「不换行」原本是为西文排版准备的。在英文原版里,这个选项菜单写作 No Break,用户选择任意几个字符,再勾选这个选项之后就可以保证不会在此断开。显然这是局部的、手动指定,并不具有普适性。虽然中文破折号,也可以这样手动选择后勾选「不换行」,但如果全篇文档有十几个破折号,就必须一一手动选择进行设置,非常麻烦。
这个「禁止断字」是 Adobe 为东亚排版而设置的功能,或者应该严格地说,这是为了实现日本 JIS X 4051「分离禁止」处理而设置的功能。翻阅 JIS X 4051 原文可以知道,日文排版所谓「分离禁止」是指字符之间不能断开,且在标点挤压等间距调整处理时也不被拉开;具体对象有破折号、省略号、「连数字」、西文单词等。显然,与「不换行」单纯功能相比,这个需求更突出了「在标点挤压等各种间距调整处理时也不被拉开」的重要性。如果忘记定义,破折号的两个字符之间在两端对齐调整字距时依旧有被断开的危险。因此,即使决定要采用「宽式」风格不避头尾,在「避头尾规则集」对话框上方里的「禁止在行首的字符」里删除掉相关字符,但依然要记着把所有这些相关字符(为了保险,建议把 U+2014、U+2015、U+2500 等等)都写入底部「禁止分开的字符」定义表里,保证「避中间」,不至于连用时从中间断开。
《芝加哥风格手册》(The Chicago Manual of Style,第 17 版)第 6.83 节指出:「按英国用法,在长文中,比起 em dash 通常更偏好使用一个 en dash(前后加空格);也有一些非英国出版社追随这种方法。」而在《新牛津风格手册》(New Oxford Style Manual, 2016 版)第 4.11.1 节中也指出「很多英国出版社用 en rule 前后加空格作为插入用的 dash 符号,但是牛津风格和大部分美国出版社使用 em rule。」↩︎