跳转至

字形和字体

刚刚我们知道了计算机中所有的字符都是通过编码来表示的。然而,电脑屏幕上的同一个汉字,往往也有着不同的表现形式。这又是怎么做到的?难不成,Unicode为同一个汉字的不同样子都分配了不同的编码?显然不是这样。

从字符到字形

Unicode为每一个抽象字符都分配了一个唯一的编码,例如汉字“汉”的Unicode编码是U+6C49。但是这仅仅规定了这是什么字符,却并没有规定这个字符长什么样。真正的字符长相,是由字形来决定的。字形实际上是在计算机出现之前就已经存在的概念,指的是是字符的具体表现形式:横平竖直还是行云流水,撇是飘带还是刀刃,点是瓜子还是露珠,这些都由字形来决定。

同一个字符可以有着多种字形,这些字形可以有着不同的风格和特点。例如,宋体、黑体、楷体等都是汉字的不同字形;英语等字母语言也有不同的字形,例如Times New Roman、Arial、Courier New等。把目光放远到全世界,我们会发现同一个字符在不同的国家和地区也有着不同的字形,例如中国汉字和日本、韩国所用汉字的字形就有着明显的差异。但是它们都是同一个字符,只是字形不同而已——这便是大一统下的多样性。

不同的字形可以给人不同的感觉和印象,例如宋体给人正式、庄重的感觉,而楷体则给人优雅、柔和的感觉。因此,正确使用字形可以提高文本的可读性和美观性。

从字形到字体

如果把一套风格相同的字形放在一起,装进一个索引文件,再配上一个索引表,就形成了字体文件。当计算机试图显示一个字符的时候,它就会去字体文件中查找该字符对应的字形,然后将该字形显示出来。这个过程很容易让人想到活字印刷术:把一套字形雕刻在木块上,然后把这些木块放在一个盒子里,当需要显示某个字符的时候,就从盒子里取出对应的木块,然后将其印在纸上。而实际上一开始的确是这么做的,只是把纸张换成了屏幕罢了!

一开始,人们把字体中的每一个字形作为图片来存储,也就是所谓的“位图字体”。然而这样就会出现一个弊病:每一个字体的大小是固定的,如果我们想要一个大字体,简单地放大其图片是不行的:大家可以参考在手机上放大一张图片的效果,放大后的图片会变得模糊不清,甚至出现锯齿状的边缘。难道要为每一个字号做一个字体吗?显然不现实。

1978年,王选院士主持研制的汉字激光照排系统问世,标志着我国在汉字信息处理领域实现了从无到有的历史性突破。该系统采用了点阵字模技术,不仅可以生成不同字号的汉字,还数千倍地压缩了存储空间,极大地提高了汉字排版的效率和质量。简单地说,它突破了位图字体的局限性,正式的使得字形能够被“算出来”而不是“画出来”,这使得人们彻底打开了字体编写的思路。

1982年,Adobe推出划时代的字体格式PostScript,采用三次贝塞尔曲线来描述字形轮廓。这类字体被称为矢量字体,比王选院士的点阵字模技术更进一步。矢量字体可以通过数学公式来描述字形轮廓,因此可以任意缩放而不会失真,且文件体积较小,加载和渲染速度也较快。后来,苹果公司也推出了自己的矢量字体格式TrueType,采用二次贝塞尔曲线来描述字形轮廓,算起来更快。

之后,微软联手Adobe又搞出了OpenType字体,结合了PostScript和TrueType的优点,又能往里塞其他东西(字符变体、连字、小型大写文字、旧式数字等),成为了现在最常用的字体格式。举例说,我们现在看到的ff、fi等连字,实际上就是OpenType字体中的一个特性。汉字方面,王选院士为中文字体打下的坚实地基,也显著地促进了中文字体的不断发展。直至今日,计算机对汉字的处理方式依然是小字号点阵字模、大字号矢量字形的结合;现在,TrueType、OpenType成千上万种中文字体中数以亿计的汉字字形能够被我们随意使用,也离不开王选院士的开创性工作,王选院士也被誉为当代毕昇。

从字体到屏幕

计算机屏幕是由无数个像素点组成的,每一个像素点可以显示一种颜色。当我们试图在屏幕上显示一个字符的时候,计算机会先去字体文件中查找该字符对应的字形,然后将该字形转换为一组像素点,并将这些像素点显示在屏幕上。这个过程叫做字体渲染。字体渲染的过程非常复杂,涉及到许多技术和算法,例如抗锯齿、次像素渲染、字距调整等。不同的操作系统和应用程序可能会使用不同的字体渲染引擎,导致同一个字体的同一个字符在不同的系统和应用程序中显示效果不同。

字重、斜体和复合字体

在计算机出现之前,字重和斜体等就随着着印刷术的发展而出现了。字重指的是字体的粗细程度,一般可以分为Regular(常规)、Bold(粗体)、Light(细体)等。斜体指的是字体是倾斜的,一般可以分为意大利体(也叫斜体,Italic)和倾斜体(Oblique);意大利体指的是字形本身是倾斜的,而倾斜体指的是将常规矩形字体压扁成普通平行四边形而成的字体。字重和斜体可以用来强调文本中的某些部分,例如标题、关键词等,从而提高文本的可读性和美观性。

在设计字体的时候,我们自然会考虑设计不同的字重和斜体版本。然而,如果为每一个字体都设计一个不同字重的版本,而不同字重的版本有的还需要斜体,这样就会导致字体文件数量爆炸,且每一个字体文件的体积也会变得很大。为了解决这个问题,我们可以使用复合字体。复合字体是指将多个字重和样式的字体文件组合在一起,形成一个统一的字体文件,这样不仅便于分发,也便于管理和使用。复合字体通常会包含Regular、Bold、Italic、Bold Italic等常用的字重和样式。

然而,大多数汉字字体并没有斜体字体:这是因为汉字是方块字,斜着不好看,没有这方面的需求,因此大多数汉字字体并没有斜体版本。对于英文字体而言,斜体是非常常见的,例如Times New Roman、Arial等都有斜体版本。

那有的读者会问了:为什么在MS Office中,我们能对汉字进行倾斜操作呢?这是因为,微软对斜体的定义比较宽泛:只要是倾斜的都叫斜体,而不一定非得是斜体版本的字体。对于没有斜体版本的汉字字体,微软会通过软件算法来实现倾斜效果,形成所谓的“伪斜体”。类似的,微软的Word等软件也会对没有粗体版本的汉字字体进行加粗处理,形成所谓的“伪粗体”,例如微软宋体(宋体,SimSun)就没有粗体版本,微软会通过软件算法来实现加粗效果,形成伪粗体。而对于Times New Roman等有粗体和斜体版本的字体,微软则会直接使用对应版本的字体。所以我们会发现,Times New Roman等字体的斜体和整体比起来字形有明显的差异,而宋体汉字的斜体和整体比起来字形没有明显的差异。

衬线、无衬线和等宽字体

字体可以分为衬线字体、无衬线字体和等宽字体三种类型。

衬线字体(Serif)是指在字形的笔画末端有小装饰线条的字体,例如宋体、Times New Roman等,在日本等地区也被叫做“明朝体”。衬线字体通常被认为更适合用于印刷品和长篇文本,因为衬线可以引导读者的视线,提高文本的可读性。无衬线字体(Sans Serif)是指没有衬线的字体,例如黑体、Arial等。无衬线字体通常被认为更适合用于屏幕显示和短篇文本,因为无衬线字体更简洁、现代,且在低分辨率下也能保持清晰。等宽字体(Monospace)是指每一个字符占用相同宽度的字体,例如Courier New、Consolas等,也叫打字机字体。等宽字体通常被认为更适合用于编程和代码编辑,因为等宽字体可以使代码更整齐、易读,且便于对齐和排版。一般的,汉字中的宋体、仿宋、楷体等是衬线字体,而黑体、微软雅黑等是无衬线字体。对于英文字体而言,Times New Roman、Georgia等是衬线字体,而Arial、Helvetica等是无衬线字体。Consolas、Courier New等是等宽字体。

同学们或许注意到了我没有说汉字的等宽字体。事实上,我们知道,汉字是方块字,每一个字它天然就是等宽的,所以为汉字设计等宽字体没有什么意义,也就没有汉字的等宽字体。一般排版中,往往使用汉字的无衬线字体(例如黑体、微软雅黑等)来搭配英文字体的等宽字体(例如Consolas、Courier New等),以达到较好的视觉效果。

字体的管理

随着计算机的普及和发展,字体文件的数量也在不断增加。为了方便用户管理和使用字体,操作系统通常会提供一个字体管理器,用户可以通过该管理器来安装、卸载、预览和组织字体文件。

在Windows系统中,字体管理器可以通过控制面板中的“字体”选项来访问。用户可以将字体文件拖放到该窗口中来安装字体,或者右键点击字体文件并选择“安装”来安装字体。卸载字体也可以通过右键点击字体文件并选择“删除”来完成。用户还可以通过该窗口来预览字体文件,并查看字体的详细信息,例如字重、样式、版本等。