我知道按照出版物的标准[1][2],标点符号的选择是看上下文的语境。但是无论是微软的指南[3]还是本组自己写的《工作指南》[4],对于标点的建议都不是完全按照语境(以下称为“语义正确”)来的。微软看起来几乎是完全根据美观或实用角度来选择。比如问号和叹号用半角(可能为了节省空间),引号跟随引号内的文字的语言(可能是为了美观)。《工作指南》为了美观也规定 CLI 的括号一律用半角。这个大概就是理论和工程的差别。微软的软件是要卖钱的,所以美观的权重基本就是 100%。Linux 用户虽然更偏技术一些,但是应该还是在意外观的人比在意语义正确的人更多。我这么说的原因是因为,我在朋友群里提出标点选择问题的时候,所有人都表示他们在看到文本的时候第一感觉是这个标点是否美观,而不是它是否符合语义。他们都是程序员,但都不是桌面 Linux 用户,大概也能代表普通用户的看法。
所以关于选择标点时考虑的因素,我暂时认为美观优先于语义。再看各个标点:
【括号】
这个符号按照语义应该跟随括号外侧的文本的语言。但是目前的《工作指南》对 CLI 程序是按照美观的。问题是就算按照美观,也不应该只用英文括号。大部分发行版使用默认字体的话,中文字符右侧都会有段空白,Ubuntu 这种用 Ubuntu Mono 的除外。“括号内文字两侧的空白不一样宽”明显比“中文字体的全角括号不好看”要更严重。再说现在的中文字体也很难说中文括号不好看了。
【冒号】
不管你是否认同“美观优先于语义”这一观点,我认为“foo: 未找到命令”这种句子中的冒号所在的语境就是比较模糊的,理解成中文语境或者英文语境都有一定的道理。
比如“-bash: foo: 未找到命令”这句,你的理解是“(-bash: foo): (未找到命令)”这种,但是我觉得这种前面有一连串冒号的句子是在打印调用栈(很多程序的诊断输出都是这样的),也就是类似于“(-bash: (foo: (未找到命令)))”,调用栈的每一环都是等价的,自然要用一样的冒号。
再说最简单的“foo: 未找到命令”,理解成中文环境的理由就是中文 Linux 中,输出一个带中文的行,默认就是一个中文句子,最外层就用中文标点。但是这句话也可以理解为“foo 说:‘未找到命令’”,“未找到命令”是“说”的内容,它是个子句,在正式文章中应当要用引号包围的,它自己形成了一个子环境,它的语言不应该影响到整个句子的语言。所以只看冒号左边,它在形式上是一个只有英文的句子,就因为它在中文 Linux 中出现,就认为它是中文句子,似乎有点牵强。
或者也可以理解为 CLI 最外层是一个英文环境,毕竟提示符是英文,很多程序是英文,中文程序也有很多字符串没翻译,没翻译默认语言就是英文,而且翻译完了源字符串一变就 fuzzy。比如说使用中文冒号,然后其中有一行 fuzzy 了:
open:权限不够
open: No such file or directory
open:打开的文件描述符过多
这种输出给人的感觉就是翻译的是“冒号+后面的句子”,但是更直观的想法是翻译的只有后面的句子而已。翻译工作只是在一个英文环境中把其中的一些子句替换为中文而已。按照这种理解的话,似乎所有这类冒号都要用英文冒号。但是像 gcc 里,“warning: ”是一个 msgid,后面有可能是英文也可能是中文,两边都是中文的话用英文冒号又太奇怪。
如果认可语境有歧义的话,还不如纯粹按照美观来,按美观的结果我觉得就应该和冒号左边的语言一致,这点我觉得我的审美应该还是比较主流的吧……话说出版物的标准也没有对这种例子作出规定,如果有规定的话就比较有参考意义,按理有可能出现这种情况的,比如可能会有书本中某一段写着:
Alice: 你好!
Bob: 你好!
这种。
【引号】
引号按照语义也应该跟随引号外侧的文本的语言,不过基本上没法在终端中见到真正的中文引号,所以为了照顾把终端字体改成中文等宽字体的用户(应该不少,至少我以前不知道有 fallback 机制时都是这样设置的,那时候主流还是文泉驿,所以不会出问题),也为了译者写 po 文件时不用在中文引号的外侧加空格(来模拟间距),就推荐用 " " 了,这个和目前的《工作指南》也是一致的。
至于“不明宽度字符的显示宽度”这个设置项,我确实是第一次听说,看了下 xfce-terminal 里面有这个设置,不过使用英文字体时改这个设置并不能把英文引号显示成中文宽度,还会导致输入的引号删不掉……然后我 xfce-terminal 里不知为何找不到 Noto Sans Mono CJK SC,也找不到文泉驿,所以测试不了在中文等宽字体下的效果了,不过应当不会影响引号的使用建议,毕竟不是默认设置,而且很多终端都没有这个设置。