这一段是为了测试宋体字的显示效果,包括宋体里面自带的英文字体,“This is english,how does it look like?”。这一行是小字。后面几个字是加粗的宋体。标点符号“,。;!”
这一段是为了测试黑体字的显示效果,包括黑体里面自带的英文字体,“This is english,how does it look like?”。这一行是小字。标点符号“,。;!”。微软雅黑是什么样子的呢“,。!”?
This paragraph shows how does serif english fonts look like,包括英文里面夹杂中文的显示效果。Is serif same as Times New roman?
This paragraph shows how does sans-serif english fonts look like,包括英文里面夹杂中文的显示效果。Is sans-serif same as Arial?
This paragraph shows how does ui fonts look like,还有专门的界面字体,比如Wdows中的Tahoma字体File->New->New Project。
#clude <stdio.h>
t ma(){
return 0;//很显然这是为了测试等宽字体
}</p> <p> #clude <stdio.h> //观察下面的代码了解monospace是否等于Courier New
t ma(){
return 0;
}
在文章最开始的一个部分(也就是这部分之前的内容),我特意写了一些文字用来测试各种字体的显示效果。这些测试文本我在HTML源代码模式下经过仔细修改。第1段的字体都是设置为宋体,包括其中的英文、小字及加粗的字。第2段除了一句外,其余的字体都设置为黑体,包括英文及小字;一句字体设置为微软雅黑,是为了对比微软雅黑和普通黑体的效果。第3段除了一句外,其余的字体都设置为Serif,包括其中的中文;一句字体设置为Times New Roman。第4段除了一句外,其余的是Sans-Serif,一句是Arial。第5段的字体都是设置为Tahoma。的两块代码,第1块代码的字体设置为monospace,第2块代码的字体设置为Courier New。为什么这样设置,我后面会配合图片逐一讲解。下面,需要先了解字体的分类及其用途。
1、英文字体分为三类,分别是有衬线字体(serif)、无衬线字体(sans-serif)和等宽字体(monospace)。Serif是有衬线字体,意思是在字的笔画开始、结束的地方有额外的装饰,而且笔画的粗细会有所不同。Sans-serif就没有这些额外的装饰,而且笔画的粗细差不多。在传统的正文印刷中,普遍认为衬线体能带来更佳的可读性(相比无衬线体),尤其是在大段落的文章中,衬线增加了阅读时对字母的视觉参照。而无衬线体往往被用在标题、较短的文字段落或者一些通俗读物中。相比严肃正经的衬线体,无衬线体给人一种休闲轻松的感觉。,由于无衬线字体笔画比较饱满,所以比较适合电脑屏幕显示,在印刷和打印中,可以用无衬线字体做标题、加粗字体等表示强调。等宽字体就不用多说啦,主要用于终端字体或编程。
2、中文字体可以参照英文字体进行分类,由于中文都是等宽的,所以就只需要区分有衬线(serif)和无衬线(sans-serif)。中文的宋体、仿宋就相当于英文的serif,所以用于传统印刷和打印效果比较好。而中文的黑体、楷体、圆体等字体相当于英文的sans-serif,用于电脑屏幕的显示效果比较好,也可以用在印刷和打印中做标题和粗体字。
3、Serif字体的经典代表有Geia和Times New Roman,sans-serif字体的经典代表有Arial和Verdana,monospace字体的经典代表有Courier New和DejaVu Sans Mono。
电脑中的字体显示技术电脑中的字体既是一门艺术,也是一门技术。要将屏幕上的字体显示得好看难度可不小。字体可以表示为点阵(bitmap),也可以表示为轮廓(outle)。点阵字体不能缩放,轮廓字体可以随意缩放。
1、要获得锐利清晰的效果,小字必须显示为点阵(bitmap),大字可以显示为轮廓;
2、显示轮廓字体时,为了让字体边缘显得比较光滑,需要对字体边缘进行抗锯齿(anti-alias);
3、为了获得更好的效果,字体设计厂家在设计字体的时候,会对字体进行微调(htg)。字体微调是一项耗时耗力的工作,所以就产生了自动微调技术(autoht);
4、为了让字体在液晶显示器上获得更好的效果(主要也是为了字体边缘光滑),产生了次像素平滑技术(subpixle),微软的ClearType技术也属于次像素平滑技术的一种。所谓次像素,是指每个像素中的单独的R、G、B分量,所以次像素平滑用好了,字体边缘看起来会更平滑,如果用不好,字体边缘就会显得花花绿绿。也正是因为CRT显示器和液晶显示器每个像素的组成方式不一样,所以在CRT显示器中不能开次像素平滑。
5、增加屏幕的dpi,可以增加画字的像素,从而获得更平滑的显示效果。比如在传统的96dpi的电脑显示器上,一个9pt的字符用12个像素绘制,一个12pt的字符用16个像素绘制,使用轮廓字体确实很难做到平滑。在目前的安卓手机、苹果iPad等设备上,高分辨率的润眼屏都在300dpi以上,画一个12pt的字符可以用50多个像素,字体平滑自然不是问题,根本不需要使用点阵、微调、抗锯齿、次像素等技术。我认为,随着显示器硬件技术的发展,以上技术都将成为浮云。
以上图片是字体测试段落在W7系统中的显示效果。除了标题和小字外,其它的字体都是12pt。可以看到,12pt的宋体字和serif的英文字体显示为点阵,所以获得了清晰锐利的效果。而黑体、微软雅黑和sans-serif字体都没有点阵,由于sans-serif本身笔画饱满,所以也获得了不错的显示效果。据说微软雅黑每个字造价100美元,专为ClearType技术而设计,从效果上看,并不比普通黑体强多少。
前面讲过,serif和sans-serif是字体的分类名,而不是具体的字体名。Times New Roman是Wdows下最经典的serif字体,从上图可以看出它并不是serif字体的首选字体,设置为serif的字体和设置为Times New Roman的字体显示不一样,都是很漂亮的有衬线字体,serif的中文选择了一种和宋体不同的点阵字体。Arial字体是最经典的无衬线字体,从图中可以看出设置为sans-serif和设置为Arial的字体显示效果相同。只是sans-serif的中文被宋体的点阵代替了。Tahoma字体的显示效果和sans-serif只是宽度上略有不同,依然很饱满。
使用Ctrl+鼠标滑轮可以缩放网页。将网页放大后显示,可以查看轮廓字体的显示效果,如下图
(注意我文中的图片都不是原始大小,可以通过Ctrl+鼠标滑轮放大后观看,也可以在新窗口中打开图片观看。)
Lux中的字体 下面,通过大量的图片直观地感受不同的字体以及不同的字体显示技术会带来什么样的效果。
上图是CentOS 5中的显示效果,是不是觉得字体很虚?系统菜单中的字体倒是很锐利。其实在Fedora 9之前,Red Hat系列的Lux发行版中文字体显示都很模糊。也正是因为这个原因,我曾经有一段时间偏向于使用中科红旗的Lux。CentOS中的字体显示发虚的原因就是因为它的小字没有使用点阵。
小字使用轮廓字体就会发虚,大字使用轮廓字体效果就要好得多。使用Ctrl+鼠标滑轮将网页放大,可以看到大字显示很清晰饱满。如下图
CentOS 5中的字体显示还有一个奇怪的现象,那就是它认为serif的中文应该是楷体,而且它的sans-serif也显示的是有衬线字体,很显然这是不对的。而且由于历史的原因,它没有黑体。如下图
CentOS系统中对中文的支持主要依赖于2001年文鼎向开源界贡献的两套字体文鼎PL中楷和文鼎PL细上海宋,如下图
下面来看看Ubuntu中的显示效果。从下图中可以看到,Ubuntu侧重于sans-serif和黑体,除了明确指定serif和Times New Roman的字体外,其余全部显示为sans-serif和黑体。而且没有点阵。这进一步印证了我前面说的黑体适合屏幕显示、宋体适合打印和印刷。在系统中全部显示黑体虽然不会丢失文字的信息,肯定会影响美观。Ubuntu没有正确地为monospace选择等宽字体,对Courier New倒是选择了一个很漂亮的等宽字体进行替代。
使用Ctrl+鼠标滚轮将网页放大,看到清晰饱满的字体,如下图
对于界面字体,Wdows下有Tahoma,Ubuntu下也有专用的界面字体,该字体就叫Ubuntu,是开源的。自Ubuntu 14.04开始,已经没有采用文泉驿的黑体了,而是改用Droid Sans Fallback,没错,就是Google花钱为Android系统设计的字体。反正该字体也没点阵,我觉得显示效果也就那样。
下面再来看看Fedora 20,该系统也是以黑体为主。从下面的图片中可以看到,除了Times New Roman,其它的字体显示都是一个样。
小字是点阵,放大后,显示为黑体,如下图
查看Fedora 20系统,可以看到它还是安装了AR PL UMg,也就是宋体,它没有使用,而且它没有安装楷体,虽然它的软件源中有cjkuni-ukai。它使用的黑体是文泉驿系列。
之前发表的几篇随笔都是在Ubuntu 14.04下完成的,这次我决定换到Fedora 20系统下。晒一下我的桌面,如下图
从AR PL这几个字符可以看出,AR PL UMg和文鼎贡献的那两套字体是一脉相承的。确实如此,只不过是经过合并、修改、增加了日语韩语及香港常用字型后,更名为CJKUniFonts,据说含有点阵。从名字可以看出,有了这套字体,中日韩都可以搞定。CentOS 6的主打字体就是它。如下图,小字有点阵,清晰锐利
放大后,显示轮廓字体,不过好像缺了黑体,如下图
这套字体唯一的缺点就是它的标点符号,逗号和句号经常跑到一行的中间,而不是一行的底部。这都不是什么大事儿,其实,微软雅黑的引号也不漂亮,不是吗?
CentOS 6中已经有了文泉驿,如下图,之所以没有显示黑体不是因为没有黑体,而是因为没有正确配置
通过上面一系列的截图,可以看到各个操作系统都使用了哪些中文字体,也展现出了各个操作系统在字体配置方面的缺陷。从另一个方面,也反映出了挑选字体的趋势。可以如下
1、Lux系统中的宋体最早只有文鼎贡献的细上海宋,而且还没有点阵。后来发展到CJKUniFonts,宋体才有了点阵,它的字体名叫AR PL UMg,在Lux系统上想要使用宋体,就全靠它了。CJKUniFonts的点阵似乎不太符合我们的习惯,好在文泉驿有非常漂亮的点阵字体,虽然只覆盖了9pt到12pt的范围。
2、Lux系统中最开始黑体缺乏,现在大家都认识到了黑体在屏幕显示中具有较好的效果,于是就黑体泛滥了。微软花大价钱请人设计的微软雅黑是黑体,开源字体文泉驿做的也是黑体,Google花钱请人做的Droid Sans Fallback还是黑体。Ubuntu用黑体,Fedora也用黑体。可以说,文泉驿选择黑体作为切入点真的是选对了,也确实是我们广大Lux使用者的福音。
3、即使是最新的Lux发行版,如Ubuntu 14和Fedora 20,其字体设置也不合理,对serif、sans-serif、宋体、黑体的理解都不正确。所以,对于字体,我们还是得自己配置。
字体配置实战下面,将以Fedora 20为例,自己动手将它配置为正确的显示效果。目前,在Lux系统上配置字体的工具是Fontconfig。
为什么是Fontconfig
感谢这个时代,曾经混乱不堪的字体配置方法终于被Fontconfig一统江湖。在Lux中,字体配置曾经各自为政、混乱不堪,XServer、Xft、GTK、GTK2、QT等等各自采用不同的配置手段,字体引擎也有Type1、FreeType等。目前,可以认为在Lux系统中只需要配置FontConfig即可。
XOrg的官方网站上的文档说明XOrg中有两种字体系统,一种字体系统是XServer自带的字体系统,另一种就是Xft,而且XOrg官方建议所有的界面库的开发者首选Xft字体系统;对于字体引擎,现在只剩下FreeType了,Type1的功能已经合并到了FreeType中。FreeDesk.的官方网站上有Xft、Freetype以及Fontconfig的文档,虽然很简略,也提到Xft1.0及以前的版本,需要通过XftConfig文件来配置字体,从Xft1.1以后,都采用Fontconfig来配置字体;Fontconfig的文档也说它只负责字体的配置,不负责字体的显示。
So,配置Lux中的字体,我们只用理会Fontconfig,还有疑问吗?
学习Fontconfig
学习Fontconfig的最佳方式是阅读man fonts.conf手册页,,就是阅读/etc/fonts/conf.d目录下的配置文件,从实例中学习。
Fontconfig的功能就是帮助应用程序选择字体并指导字体的显示效果(只能说指导,因为具体的显示由Xft、Freetype等说了算),用什么策略选择字体及用什么选项显示字体,通过配置文件来指定。Fontconfig对配置文件进行两遍扫描,第一遍对应用程序传递给Fontconfig的字体列表(称为pattern)进行操作,通过添加、删除、替换pattern中的字体名,让应用程序得到相应的字体;第二遍对已经选择的字体进行操作,这时一般不改字体名了,而是对抗锯齿(antialias)、微调(htg)、自动微调(autoht)、微调级别(htstyle)以及次像素平滑(rgba)等属性进行控制。
Fontconfig配置文件的语法,这个不用我在这里唠叨,看man fonts.conf手册页即可,一点也不难,它的很多元素,如match、target、test、edit、strg、bool、double、const等,本身就是自解释的,看到这个单词就知道它是什么意思。它的原则就是对每一个<match...>...</match>,通过<test...>...</test>来选择要编辑的元素,然后使用<edit...>...</edit>来对该元素进行编辑。
配置Fedora 20 Fontconfig读取的配置文件是/etc/fonts/fonts.conf,然后,根据/etc/fonts/fonts.conf里面的<clude>...</clude>信息来加载其它的配置文件。Fedora 20默认是加载/etc/fonts/conf.d目录下的所有文件。,/etc/fonts/conf.d目录下的文件太多了,引入了很多其实没有必要的复杂性。对于我这种追求简洁的人,我直接就把它改了,让/etc/fonts/conf.d下的文件去见鬼,从我自己的主目录的fonts.conf.d目录下加载配置文件吧。如下图,我注释掉了第71行,增加了第72行
下面正式开始写配置文件。
第一步将不标准的字体分类命名更改为标准的字体分类命名
英文的字体分类有serif、sans-serif和monospace,中文的分类有“宋体”和“黑体”,但我们不能保证别人在请求字体的时候拼写都是准确的,比如有可能拼写成“sans serif”或“sans”、“mono”等,中文也可能写成繁体“宋體”、“黑體”或者拼音“SongTi”、“HeiTi”等,为了后面配置文件的简洁,这些不标准的分类名要先替换成标准的分类名。
英文的分类名的标准化/etc/fonts/fonts.conf这个主配置文件(就是我上面截图的那个文件)已经做了,其完整代码如下
复制代码