出人意料的汉字字形显示问题——关于“赵孟頫”的那笔糊涂账
无论是我们在翻阅实体书或其他实物印刷品时,还是在浏览电子书、网页、使用输入法输入文字时,都会经常遇到某些文字的字体明显和它前后其他文字不一样的情况。

一个故意改变字体的有趣例子,出自群众出版社 2006 年版《古拉格群岛》。
除了极少数刻意改变字体的案例,更多情况是因技术限制而直接“弃疗”,大多数文字字形问题都有着复杂的历史和技术原因。我们常以为这些问题很容易解决,但实际上远非如此。

电子版《越南概论》中“左口右从”的直接弃疗行为。
例如使用Word等文本编辑器时,可以很容易地给一个字体调整格式,如加粗。在字体设计中,笔画的粗细程度称为“字重”(font weight)。
但是与我们的“常识”大相径庭的是,在专业的排版软件中,这种看似简单的改变同一个字形字重的操作反而是不行的。如果我们使用的字体没有专门的“字重”设计的话,比如我们常见的字体“书宋”“楷体”“报宋”,那么排版人员即使想要简单地把一个字形变粗或变细一点点,都需要替换成另外相近的字体。有编辑甚至因为这种不得不为之的变换字体、字体无法统一的问题,导致自己编辑的图书被读者投诉为“印刷质量有问题”。

图源 台湾地区历史语言研究所《古文字與古代史(第一輯)》,一个因改变字体即需另行专门造字的实例。
周啸天《唐诗鉴赏辞典》此页电子版中体现的是另一种常见情况。简化“糹”后的“緌”字形无法正常输入和显示,出版方最后只得选择了使用一张图片代替的方式解决。

周啸天《唐诗鉴赏辞典》电子版中的一页,简化“糹”后的“緌”字形无法正常显示,出版方只能自造一张图片代替之。
而规范字形应为“兆”+“页”的繁体字“頫”,因为“赵孟頫”这个人名的高频出现,一度成为此类涉及繁体汉字简化问题中最典型的“问题字”之一。

王宁主编《通用规范汉字字典》中的相关条目
在 2013 年《通用规范汉字表》推行后,“頫”的类推简化字“正式”成为规范汉字,赵孟頫更是无法起自己于地下,像钱锺书坚持自己名字中的“钟”字应写作“锺”一样反对“頫”的简化。
虽然《出版物汉字使用管理规定》中有“法律、历史、传统等特殊需求如人名、地名,能够使用繁体字”之类的条例,但依然有编辑反映,她们工作中的遇到的检查标准往往是“不允许混用繁简汉字”。

《现代汉语词典》(第 7 版)中已经收录了“頫”的类推简化字。
这是因为“頫” 的类推简化字已为《现代汉语词典》收录,为避免被后续质检或抽检为“差错”,所以他们在遇到这个著名的人名时,为保险起见,一般是不敢保留繁体的“頫”的。

左图红圈中为出版方自造的“頫”简化字,右图划线处保留了“頫”字的繁体字形。
可是麻烦的地方在于,“頫”的类推简化字成为规范汉字并不意味着它也成了一个可以像“正常”的汉字一样,在排版文件中输入字形编码的汉字。上图左半红圈中的“頫”简化字,虽然看起来字体似乎与其他文字没有什么区别,但实际上这个简化后的“頫”字是无法直接在出版方的排版文件中输入的,乃是出版方的自造字。此自造字不易被察觉,仅因其构形简单。其实造出这个字形非常容易——任何没有受过专门训练的读者都可以自行完成,打开InDesign 软件,我们只需调入“兆”和“页”两个字形,压缩它们,并缩短间距后拼接起来即可完成。这样简单的字形是很容易造到“完美”得肉眼难以辨别的。

它实际上有着自己的标准 unicode 编码,可是很多时候依然无法正常输入、显示。
不仅如此,这个类推简化字实际上是拥有 Unicode 标准编码“U+2 B5AF”的,但莫说通行的排版软件,我们使用的一般输入法都依然无法直接打出,而且在多数情况下,它甚至在网页页面中也无法正常显示。
要想彻底搞清楚这笔看起来千头万绪的糊涂账,我们首先需要了解一点点汉字编码及字形存储和显示的基本原理。
现实中根本没有这个字,却有自己通用编码的神奇“幽灵汉字”
当我们通过某种输入法输入汉字时,首先会被计算机映射为一种它直接“认识”的编码,亦即字符集内部标准编码,简称内码。 比如最早的内码ASCII(American Standard Code for Information Interchange,美国信息交换标准代码),它的设计逻辑基于拉丁字母,主要是为了解决现代英文的标准编码问题创制的。

ASCII 码表
为了便于识读,ASCII编码通常记作十或十六进制,比如字母“A”的码位可能会被表示为65或41,但是它在计算机内部储存的实质上是一个八位的二进制编码 0100 0001。因为现代计算机系统以字节(8位)为单位存储,所以7位二进制编码前要补一个0凑足八位。很容易理解,ASCII的编码空间范围为0000000~1111111,它一共可以表示的编码总数量只有128个(2的7次方)。
但只有英文内码显然是不够的,其他国家、文字显然也需要一套自己的内码。而现今全球最通用的内码Unicode就是这么一套号称为所有语言中的“每个字符”都分配了唯一对应编号的码位。
在有这么大雄心和这么多需要编码的符号的情况下,原来的编码空间自然就不够用了。1991年Unicode 1.0诞生时采用固定的16位编码,Unicode的码位一般以U+前缀表示,所以有216(U+0000 ~ U+FFFF)=65,536个码位。

Unicode 代码分配示意图,图源《中文信息处理技术》
这65536个码位一一映射的字符覆盖了包括中文在内的当时几乎所有主流语言的字符,我们一般叫它基本多文种平面( BMP, 又称为 Plane 0 )。而其中的汉文字符编码部分,我们通常称之为CJK(CJK Unified Ideographs,中日韩统一表意文字)区块,一共20992个汉字字符进行了编码。
在普通语言学领域,关于汉字是否属于“表意文字”(ideograph)以及这一分类本身的合理性,学界存在显著争议。周有光、裘锡圭等权威学者都认为从文字系统的构形本质来看,汉字的性质可定义为“意音文字”(logographic-syllabic writing),纯粹的“表意文字”根本不存在。但是在自然语言处理(NLP)领域,从CJK的名称“中日韩统一表意文字”就可以看出,汉字毫无疑问是被看作为一种表意符号的。更准确地说,汉字被认为是一种视觉-语义单元,所以其编码系统的设计逻辑的确与类似英语的拼音文字有着根本性的差异。
格外值得注意的是,CJK 并不仅仅涵盖内地使用的汉字,还囊括了包括日本国语汉字、和制汉字,韩国韩文汉字,越南喃字,台湾地区和香港繁体汉字等其他使用汉字国家/地区的字形符号,甚至还包括了很多中国少数民族文字的编码,比如西夏文、契丹小/大字、女书等等等。

一个著名的只存在于 Unicode 里的幽灵汉字:彁
这种跨地区的标准和早期制定标准流程的粗疏会导致出现一些匪夷所思的离谱情况。由于早期技术限制,手写录入地名时因油墨浸染或照片模糊,导致“彊”右半部误录为“哥”,最终使“彁”这一错误字形被收入Unicode。“彁”就是这么一个著名的只存在于 Unicode 里,但是现实中不存在的幽灵汉字。

导致同一个字字形区别的诸多因素,图源《中文信息处理技术》
我们很容易想到,很多“汉字”词在不同语言中可能具有完全相同的字形,Unicode 的编码不考虑不同语言的语义问题。比如日语中的“娘”(女儿或年轻女性)与汉语中的“娘”(母亲)语义完全不同,其编码却都是 U+5A18。
那么如果是一个只具有略微差别的字形呢?会导致字形产生细微差别的因素有很多,比如笔画的方向、长度、曲度的区别,笔画相交、合并与否,个别笔画的增减、笔画方式的差异等。这些不同标准字符集中细微的字形区别,在所谓的“表音文字”字符集中不能说完全没有,但很少见,可是在东亚表意文字中,这就成了需要妥善解决的核心问题之一。

“剑”字的六种字形变体,图源《中文信息处理技术》
比如“剑”字有至少如图所示的六种不同的字形变体,大陆一般用“剑”,日本一般用“剣”,台湾地区一般使用字形则为“劍”,可是他们的 Unicode 编码是同一的,亦即只要是字形相似、字源相同、语义相关的汉字,就在同一个码位上。
字形显示的基本原理:从离散点阵位图到参数化曲线矢量图
Unicode在本质上定义的是字符的抽象身份(Identity),而非它的具体字形。而我们或多或少接触过的“字体”文件,储存的就是字符的不同字形。操作系统通过字体文件,把特定unicode码位的字形渲染出来,就呈现出我们在屏幕上看到的样貌了。

点阵字形示例图,同上
作为二维平面图形,决定汉字字形的要素非常复杂,至少包括有笔画层面上的基础笔形(横竖撇捺钩等)、动态笔势(笔画方向轻重)、空间关系(交叉/相接/断开)等,构件层面上的相对位置、形变规则(不同偏旁部首组合时大小变化)、嵌套层次,整体层面上的视觉平衡、密度协调、风格等。
在文字处理技术的早期阶段,字形信息的数字化记录的通用解决方案是离散点阵位图。其基本技术原理很简单,即把字形分割为小正方形栅格矩阵,对于其中的每一个点阵单元都可以用坐标记录其位置,用有色(1)和无色(0)记录其状态并对之进行二值化信息编码。

笔画矢量压缩法示例图,同上
而基于矢量的方案很快后来居上。为二维汉字平面图形建立笛卡尔坐标系,记录每个笔画始点与终点的坐标后,很容易用向量表示所有笔画和空笔画的方向与长度。但显然,如果只有端点坐标的话,笔画只能被记录下静态轮廓,更多的笔势信息变化是根本无法被记录的,而用控制点定义平滑路径的贝塞尔曲线能够解决这个问题。参数化曲线很快发展成为矢量方案的核心技术。随着技术的进一步发展,使用二次贝塞尔曲线描述字形轮廓的TrueType(.ttf)和三次贝塞尔曲线的OpenType(.otf)已经成为了现今最通行的矢量字体技术手段和字体文件格式。

ttf、otf 等是现在最通行的字体文件格式
字形的向量就是字体文件储存的数据,最后屏幕上渲染出的字形则是把向量还原。不难想见,字符集规模巨大、必须多字节表示的汉字系中文字体与拉丁系西文字体不仅在内码编码逻辑上有巨大差别,它们的字形数字化方案也判若云泥。一个西文字符一般只需要几十个控制点即可妥善记录,但是记录一般中文字符需要的平均控制点数量是西文字符的十倍之多!
古籍数据库——汉字是开放集合,永远无法穷尽
BMP中仅有20902个基本汉字(U+9FA6 至 U+9FFF还包含90个补充汉字),在理论上,这个数量已经能够覆盖99%的日常使用场景,但是那看似微不足道的所谓“1%”却会引发各种各样的问题。就比如中国人姓名中有非老旧系统无法识别的非基本汉字人口多达6000多万,他们日常生活的方方面面,曾经都会因为自己起了一个没有编码汉字的倒霉名字而受到影响。为那些起初没有被编码的汉字字符补办“身份证”迫在眉睫。

这些社会问题都是BMP外汉字惹的祸!
更“要命”的是,Unicode的伟大愿景远不止于为现存语言编制字符目录,它还有着一种近乎史诗般的重要使命:散落在人类历史长河中的所有文字符号,Unicode 都要为之设计内码。而历史曾经存在过的汉字字符何止千千万万,其数量之巨大、审定之艰难,都是增补工作的巨大挑战。
在BMP外的扩展平面中增补汉字字符的工作,主要是由表意文字小组IRG(Ideographic Research Group)负责,截至2024年发布的Unicode 16.0,IRG已经为CJK增补了将近 7万个汉字字符。

在IRG官网https://www.unicode.org/irg/可以查询他们的工作情况
但即使搁置IRG引起过诸多争议的“字理”“字源”等学术纠纷不论,扩展平面内码在人们日常使用中的最大问题其实是除了BMP中的20902个基本汉字外,其余的增补即使有了编码,也无法通过一般的输入法输入。

知乎用户“奈白不弍”总结的Unicode中汉字及相关字符所有占用区段
相较于输入法限制,Windows与macOS的默认字体支持问题更为严重。由于它们也仅支持BMP汉字,所以扩展字符在普通用户的电子设备屏幕上甚至无法渲染字形,这就是“頫”的类推简化字既无法被一般的输入法打出,在很多用户的屏幕上也显示不出来的根本原因。
即使在专业领域也存在着同样甚至是更多的麻烦。比如在通行的古籍数据库中会用到的字,同样也是即使已经有了编码,数据库中能够调出,但是只要它不在基本平面上,就依然无法进行检索、查询、统计等操作,所以实质上与“集外字”没有区别。所以在实际工作工作中,学者们依然要把这个已有扩展编码的字符改成一个基本平面编码,后续的数据处理才能真正开展。
而这些数量已经足够庞大的字形还仅仅是“楷写字”,“原形字”则在一个更加复杂、难以数据化的层面上。比如仅仅西周金文“宝”一个字的构形,即高达 1060 个。古文字的数字化开发专家刘志基在《数据库古文字研究论稿》中指出过:
传统文字学研究的第一手资料是以印刷、墨拓或抄写、刻写等手段形成的纸张等自然物载体形式,资料库文字学研究的资料是数字化形式的资料库资源。从查询检索的角度看,自然物载体形式的一手资料是以无次序、无条理状态存在的,因此出于特定研究目的处理,一般都需要人工目验查找、编辑整理。
其实中国大陆早就组织过古汉字编码专家参与IRG的定期会议,但汉字古文字编码的工作依然进展缓慢。或许这些本来就以非标准形态存在的“原形字”更加鲜明地昭示了表意文字的某种根本特征——正如IRG中从事Unicode和OpenType东亚部分相关工作的专家陈永聪指出的那样,“ IRG的这项工作可能永远都无法停,因为汉字是一个开放的集合,它永远没法完结。”
“永不离职的中华书局员工”——我们这样造出了本不存在于电脑中的字
如果说编码问题是理论层面的挑战,那么古籍排版则是这一冲突在实践中的集中体现。学者们对专业数据库的终极期望是为历史上所有连标准形态都没有的字形建立起可靠的谱系与可供后续数据处理的标准编码系统。然而出人意料的是,古籍图书排版专家的志业却与之异若霄壤:“补字补字,我们认为我们补的东西根本就不是字,我们只是把需要的图片给组合出来。我们的员工就没学过中文的,那些字念什么,是什么意思,我们根本就不懂,也不需要懂。我们补字只是为了方便我们的后续工作,仅此而已,有任何问题都由编辑提出、解决,我们只进行后续的批量操作。”
德彩汇智是国内最专业的古籍类图书排版公司。诸如中华书局、北京大学出版社等赫赫有名的“古籍出版专业户”,在自己出版社内部其实几乎没有排版员工,其古籍类图书基本都是交由德彩汇智进行排版的。公司负责人刘庆伟笑称,自己可以算是“中华书局他们永不离职的员工”。
在他看来,古籍排版是一种市场规模与需求都非常小、技术含量不高、附加值也很低的工作,所以“我就只能用改换形式的方式完成客户的要求。”
在2005 、2006年前后,中华书局有了自己的照排室,并开始准许社内与社会上的社外人员合作,刘庆伟也正是在这个时候就开始了与中华书局的长期合作。
现今通行的"CTP"(computer-to-plate,直接制版技术)大大降低了排版技术的成本与难度。然而在当年,排版需要把文件先做到胶片上,晒版(曝光)后还需要做到PS版(Presensitized Plate,预涂感光版)上才能成为印刷机可以使用的印版,这就叫激光照排,是一项相当复杂与繁琐的技术。
刘庆伟还记得当年工作时人人均需常备一本《北大方正汉字内码字典》,片刻不得离手的情景。那时候的排版人员要想完成工作,是需要自己死记硬背所有待排文字的编码的,他直言那时做排版“非常受罪”。

《北大方正汉字内码字典》
图书排版的本质是图文设计,里面也可以再细分出很多专门的门类,每个门类的排版都有自己的特点和门道,比如有专做辞书排版的,也有专做杂志排版的、科技类图书排版的等等,古籍类排版也是其中比较特殊的一块。
起初刘庆伟不懂行,想着眉毛胡子一把抓,什么类型的排版都干,结果很快发现不同类别的排版技术要求区别很大。更重要的是,最初的时候照排是个非常集中的事情,也是出版社对外合作的一块重要业务。当时很多出版机构没有特殊的关系和手段,就很难开启合作,即使侥幸开启了也维持不住。但与很多其他排版领域挤都挤不进去的状况相比,古籍排版却是压根几乎没人愿意碰。
古籍类图书的生产周期非常长,一般回款要等到图书正式出版之后,所以回款周期也特别慢,比如黄天树《甲骨文摹本大系》一书就耗时整整近十年时间才最终出版。
虽然后来国家出台了“不得拖欠中小企业款项”的政策使得回款情况有了些许好转,但利好也仅限于款项需要报备的项目类图书,如果是非项目类图书,回款问题则会依然让人叫苦不迭。古籍排版需频繁修改,但排版人员仅负责图文设计,内容审校由编辑完成。所以出版方每重新审校一次返回来的稿子,简直就跟一本新书一样。
而古籍排版最麻烦的地方是别说每个出版社、每位图书编辑,就算是具体到每一本书,他们收到的要求都很不一样,所以基本无法建立高度标准化、可简单套用的工作流程。所以德彩汇智最终定下自己的主业,就是仅仅专心服务于少数几家靠谱的古籍类出版社。虽然客户是越做越少了,但如果他们建立起自己的专业工作流,这就是一块别家很难分走一杯羹的市场。
任何稍有古籍文本录入经验的人都知晓使用形码录入的速度比使用音码高很多。现代音码输入法输入速度的提升主要依赖于其强大的词频记忆与云词库功能,但这些功能对于包含有大量的生僻字、以单字词为主的古籍文本来说,输入速度的提升可谓收效甚微。以前古籍排版工基本都是使用五笔输入法的,但随着时代的变迁,现在已经几乎找不到可以熟练使用五笔输入法的年轻人了。但是即便形码输入有这么大的好处,他们也依然决定取消员工的五笔培训环节。这是因为古籍图书的可服务客户太少了,它本质上是一个需大于求的市场,提升员工的工作速度也没更多项目可接,所以提升员工的工作效率对公司来说甚至没什么真正的意义。而补字,就是古籍图书排版工作流中最重要的环节之一,难倒是不难,但它是一项格外需要大量经验与既有成果积累的麻烦事。
在出版行业有三个最主流排版软件,分别是ID(InDesign),方正书版与方正飞翔,其中古籍排版用的基本上都是方正书版。其实字库的重要性要高于软件本身。方正书版最重要的是可以兼容它自己的大型字库GB方正超大字符集。而且最重要的是方正超大字符集中字形显示在电子屏幕上是完全正常的,电子阅读完全不受影响,可是如果用其他的排版软件和方正的字库进行印刷,就会出现字体笔画偏细的问题。而且如果排版部门用的是方正字库,那些下游的印厂也必须用。方正超大字符集V 2.0的字库规模更大,但因为价格太高,其实能用得起的排版机构很少。与方正相比,ID虽然兼容的字更多,但是它只能兼容宋体字,变化模式比较少。更重要的是,方正书版的编辑器是非所见即所得(Non-WYSIWYG)编辑器,所以它的编辑速度是明显快于所见即所得(WYSIWYG)逻辑的ID的。尤其当调入、编辑大文件时,ID仅仅显示文件的渲染效果都要耗时很久。所以在古籍排版这个行当,如果不是客户有特别的要求,一般排版都要用方正书版,尤其是如果最后还有进其他数据库的要求的话。
单纯的补字方法就像“頫”的类推简化字制法一样简单,可以拿字形组图片。组出的图片叫做图字,因为图片是固定高度的,正常的实体书里有大字、小字,图片只要放大缩小就会出问题,所以图字是一种比较麻烦的补字方式。方正书版专门的补字插件女娲补字可以在一定程度上避免这些问题,其原理相当于把与一个既有字体编码对应的字形更换成全新的字形,这个补字可以保留其文本属性并配适格式变化。当然这个编码对应的文字只能在方正书版中识别出来,用一般的复制粘贴手段是复制不出来的。
更麻烦的还是字体问题,字体不同的全都要补一个单独的字,没那么智能,所以各种字体都得造一个。在补字比例较低的时候,如果字体差别较大就容易看出来,而方正书宋和宋体差别较小,这样字体上不容易看出区别,就能减少排版时补字的工作量。正因如此,市面上的古籍大多数都是宋体字。
当然古籍排版里面又可以细分为几类,比如古文字、简牍、俗字等等,每类又都有自己的难处。比如在简牍类图书中,理论上同一个字的字形是不一样,这些字形每个都需要专门造个字出来。又比如像金甲文字,已经有隶定字的还好些,可以直接换字模,但更多的是没隶定的,而因为它们不是“方块字”,拿正常组字方法又没法组出来,那就只能做成图字了。
刘庆伟刚入行时,因为没有任何已有补字成果的积累,几乎每排一本图书,就得自己完全从零开始新补几千个字,做得头都大了。而且直到现在,古籍出版社为每个需补字支付的报酬,也是很难覆盖新造一个字的成本的。出版机构为排版公司支付报酬的模式一般是以页为基准,其余剩下的补字是按个支付。为了能够重复利用已有成果,他们自己专门做了一个字库,这样积累的补字多了,以后才可能可以抹平补字的“损失”乃至获取利润。其实还有一类更麻烦的类型是关于俗字图书的补字。比如张涌泉的《汉语俗字丛考》,这本书里处处都是需要补字的俗字,更关键的是这些新造字在其余的书里几乎无法重复利用,这本书也成为了刘庆伟职业生涯里最令自己头疼的工作项目之一。
从“赵孟頫”的简化字争议到古籍排版中的补字难题,这些技术障碍共同揭示了表意文字体系与数字编码规则间的深层冲突——汉字的开放性、编码的统一性、技术的便捷性,如同一个不可能三角,至今仍在等待更优的解决方案。
还没有评论,来说两句吧...