标点符号

文章中使用的句号、逗号、括号、引号、感叹号等符号的统称。不同语言和地区的标点种类、用法和字符宽度各不相同,直接影响字符计数和排版。

标点符号 (punctuation marks) 是为了让句子的结构和语义变得清晰而使用的符号的统称,包括句号"。"、逗号","、顿号"、"、叹号"!"、问号"?"、括号"()"以及引号等。中文排版中标点的处理尤为复杂,会直接影响字符计数和折行的方式。

中文和英文的标点体系差别很大。中文的句号"。"和逗号","是全角字符,各占一个字符的宽度。英文的句号"."和逗号","是半角字符,后面通常还要跟一个空格。这个差别直接影响字符计数,同样内容的文章,中文版和英文版里标点所占字符的比例并不一样。此外,中文还有英文里不存在的顿号"、",用在并列的词语之间做分隔。

对中文标点用法做规定的是国家标准 GB/T 15834《标点符号用法》,它逐一给出了各个标点的使用场合,例如句号用于陈述句的末尾,问号用于疑问句的末尾,书名号"《》"用于标示书名和篇名。而在排版一侧还有另一层问题:点号和括号、引号这类标点,实际的字形只用到字框的一半左右,却要占满一个全角的字位,因此这类标点连续出现时,空白会显得格外突出。把这些多余的空白压掉的做法就叫标点挤压。在网页上,过去是用 font-feature-settings 指定字体一侧的字形功能来收紧,到 2026 年 8 月,也已经可以使用直接处理标点空白的 text-spacing-trim。不过这个属性属于 CSS Text Module Level 4 的实验性功能,支持范围仅限于 Chromium 系的浏览器,而且字体里如果没有 OpenType 的 halt 或 chws 功能,它也不会生效。

避头尾 (禁则处理) 是标点排版中的重要规则。句号、逗号、顿号这类点号以及右括号、右引号不能出现在一行的开头 (行首禁则),左括号、左引号不能落在一行的末尾 (行尾禁则)。为了守住这条规则,排版时要么把溢出的字符挤进上一行,要么把它推到下一行去。在浏览器里,句号和右括号不跑到行首这一点,默认的折行规则本来就已经守住了,因此并不是非得指定 line-break。line-break: strict 额外禁止的,是让日语的小写假名 (っ、ゃ 等) 和长音记号出现在行首的折行;叠字记号 (々 等) 在默认设置下也不会出现在行首,而 loose 则反过来允许这些折行。不过挤进上一行和推到下一行该选哪一种、分离禁止要守到哪一层,这类细节并不是 CSS 能够完全再现的。

在社交媒体和即时通讯里,标点的字符计数会变成实际的问题。X (原 Twitter) 的上限 280 是加权之后的单位,全角的标点和括号 1 个要算作 2,因此中文的帖子连标点一起算进去,实际上限是 140 个字。半角的句号和逗号算作 1,所以即使是作用相同的符号,用全角还是用半角,剩下的可用字数也会不一样。想把字数压下来的时候,也能见到不打标点、改用换行或者分几条发送来断句的写法。

在编程中,标点是带有语法含义的特殊字符。分号、花括号、方括号、点号、冒号等都是编程语言的语法元素,本该按语法书写的位置上一旦用了全角的符号,就会在编译时或者运行时报错。在中文输入法和英文输入法之间切换时忘记切回来而混进去的全角标点,字形和半角的很相近,在屏幕上不容易分辨,报错信息有时也只会告诉你"存在意料之外的字符"这种程度。更麻烦的是混进字符串字面量或者注释里的情况:它不会变成语法错误,而是以比较结果不一致、搜索时找不到这样的形式在后面才浮上来。把编辑器设置成能显示不可见字符和全角字符,或者用静态分析工具去检出,才是现实的对策。

分享这篇文章