字體顯示效果測試

文字:
在文章最開始的一個部分(也就是這部分之前的內容),我特意寫了一些文字用來測試各種字體的顯示效果。這些測試文本我在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字體的經典代表有Georgia和Times New Roman,sans-serif字體的經典代表有Arial和Verdana,monospace字體的經典代表有Courier New和DejaVu Sans Mono。
電腦中的字體顯示技術電腦中的字體既是一門藝術,也是一門技術。要將屏幕上的字體顯示得好看難度可不小。字體可以表示為點陣(bitmap),也可以表示為輪廓(outline)。點陣字體不能縮放,輪廓字體可以隨意縮放。
1、要獲得銳利清晰的效果,小字必須顯示為點陣(bitmap),大字可以顯示為輪廓;
2、顯示輪廓字體時,為了讓字體邊緣顯得比較光滑,需要對字體邊緣進行抗鋸齒(anti-alias);
3、為了獲得更好的效果,字體設計廠家在設計字體的時候,會對字體進行微調(hinting)。字體微調是一項耗時耗力的工作,所以就產生了自動微調技術(autohint);
4、為了讓字體在液晶顯示器上獲得更好的效果(主要也是為了字體邊緣光滑),產生了次像素平滑技術(subpixle),微軟的ClearType技術也屬于次像素平滑技術的一種。所謂次像素,是指每個像素中的單獨的R、G、B分量,所以次像素平滑用好了,字體邊緣看起來會更平滑,如果用不好,字體邊緣就會顯得花花綠綠。也正是因為CRT顯示器和液晶顯示器每個像素的組成方式不一樣,所以在CRT顯示器中不能開次像素平滑。
5、增加屏幕的dpi,可以增加畫字的像素,從而獲得更平滑的顯示效果。比如在傳統的96dpi的電腦顯示器上,一個9pt的字符用12個像素繪制,一個12pt的字符用16個像素繪制,使用輪廓字體確實很難做到平滑。但是在目前的安卓手機、蘋果iPad等設備上,高分辨率的潤眼屏都在300dpi以上,畫一個12pt的字符可以用50多個像素,字體平滑自然不是問題,根本不需要使用點陣、微調、抗鋸齒、次像素等技術。我認為,隨著顯示器硬件技術的發展,以上技術都將成為浮云。

以上圖片是字體測試段落在Win7系統中的顯示效果。除了標題和小字外,其它的字體都是12pt。可以看到,12pt的宋體字和serif的英文字體顯示為點陣,所以獲得了清晰銳利的效果。而黑體、微軟雅黑和sans-serif字體都沒有點陣,但是由于sans-serif本身筆畫飽滿,所以也獲得了不錯的顯示效果。據說微軟雅黑每個字造價100美元,專為ClearType技術而設計,但是從效果上看,并不比普通黑體強多少。
前面講過,serif和sans-serif是字體的分類名,而不是具體的字體名。Times New Roman是Windows下最經典的serif字體,但是從上圖可以看出它并不是serif字體的首選字體,設置為serif的字體和設置為Times New Roman的字體顯示不一樣,但是都是很漂亮的有襯線字體,serif的中文選擇了一種和宋體不同的點陣字體。Arial字體是最經典的無襯線字體,從圖中可以看出設置為sans-serif和設置為Arial的字體顯示效果相同。只是sans-serif的中文被宋體的點陣代替了。Tahoma字體的顯示效果和sans-serif只是寬度上略有不同,但是依然很飽滿。
使用Ctrl+鼠標滑輪可以縮放網頁。將網頁放大后顯示,可以查看輪廓字體的顯示效果,如下圖:

(注意:我文中的圖片都不是原始大小,可以通過Ctrl+鼠標滑輪放大后觀看,也可以在新窗口中打開圖片觀看。)
Linux中的字體 下面,通過大量的圖片直觀地感受不同的字體以及不同的字體顯示技術會帶來什么樣的效果。

上圖是CentOS 5中的顯示效果,是不是覺得字體很虛?系統菜單中的字體倒是很銳利。其實在Fedora 9之前,Red Hat系列的Linux發行版中文字體顯示都很模糊。也正是因為這個原因,我曾經有一段時間偏向于使用中科紅旗的Linux。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+鼠標滾輪將網頁放大,看到清晰飽滿的字體,如下圖:

對于界面字體,Windows下有Tahoma,Ubuntu下也有專用的界面字體,該字體就叫Ubuntu,是開源的。自Ubuntu 14.04開始,已經沒有采用文泉驛的黑體了,而是改用Droid Sans Fallback,沒錯,就是Google花錢為Android系統設計的字體。反正該字體也沒點陣,我覺得顯示效果也就那樣。
下面再來看看Fedora 20,該系統也是以黑體為主。從下面的圖片中可以看到,除了Times New Roman,其它的字體顯示都是一個樣。

小字是點陣,放大后,顯示為黑體,如下圖:
查看Fedora 20系統,可以看到它還是安裝了AR PL UMing,也就是宋體,但是它沒有使用,而且它沒有安裝楷體,雖然它的軟件源中有cjkuni-ukai。它使用的黑體是文泉驛系列。

之前發表的幾篇隨筆都是在Ubuntu 14.04下完成的,這次我決定換到Fedora 20系統下。曬一下我的桌面,如下圖:

從AR PL這幾個字符可以看出,AR PL UMing和文鼎貢獻的那兩套字體是一脈相承的。確實如此,只不過是經過合并、修改、增加了日語韓語及香港常用字型后,更名為CJKUniFonts,據說含有點陣。從名字可以看出,有了這套字體,中日韓都可以搞定。CentOS 6的主打字體就是它。如下圖,小字有點陣,清晰銳利:

放大后,顯示輪廓字體,不過好像缺了黑體,如下圖:
這套字體唯一的缺點就是它的標點符號,逗號和句號經常跑到一行的中間,而不是一行的底部。這都不是什么大事兒,其實,微軟雅黑的引號也不漂亮,不是嗎?
CentOS 6中已經有了文泉驛,如下圖,之所以沒有顯示黑體不是因為沒有黑體,而是因為沒有正確配置:

通過上面一系列的截圖,可以看到各個操作系統都使用了哪些中文字體,也展現出了各個操作系統在字體配置方面的缺陷。從另一個方面,也反映出了挑選字體的趨勢。可以總結如下:
1、Linux系統中的宋體最早只有文鼎貢獻的細上海宋,而且還沒有點陣。后來發展到CJKUniFonts,宋體才有了點陣,它的字體名叫AR PL UMing,在Linux系統上想要使用宋體,就全靠它了。但是CJKUniFonts的點陣似乎不太符合我們的習慣,好在文泉驛有非常漂亮的點陣字體,雖然只覆蓋了9pt到12pt的范圍。
2、Linux系統中最開始黑體缺乏,現在大家都認識到了黑體在屏幕顯示中具有較好的效果,于是就黑體泛濫了。微軟花大價錢請人設計的微軟雅黑是黑體,開源字體文泉驛做的也是黑體,Google花錢請人做的Droid Sans Fallback還是黑體。Ubuntu用黑體,Fedora也用黑體。可以說,文泉驛選擇黑體作為切入點真的是選對了,也確實是我們廣大Linux使用者的福音。
3、即使是最新的Linux發行版,如Ubuntu 14和Fedora 20,其字體設置也不合理,對serif、sans-serif、宋體、黑體的理解都不正確。所以,對于字體,我們還是得自己配置。
字體配置實戰下面,將以Fedora 20為例,自己動手將它配置為正確的顯示效果。目前,在Linux系統上配置字體的工具是Fontconfig。
為什么是Fontconfig
感謝這個時代,曾經混亂不堪的字體配置方法終于被Fontconfig一統江湖。在Linux中,字體配置曾經各自為政、混亂不堪,XServer、Xft、GTK、GTK2、QT等等各自采用不同的配置手段,字體引擎也有Type1、FreeType等。目前,可以認為在Linux系統中只需要配置FontConfig即可。
XOrg的官方網站上的文檔說明:XOrg中有兩種字體系統,一種字體系統是XServer自帶的字體系統,另一種就是Xft,而且XOrg官方建議所有的界面庫的開發者首選Xft字體系統;對于字體引擎,現在只剩下FreeType了,Type1的功能已經合并到了FreeType中。FreeDesktop.org的官方網站上有Xft、Freetype以及Fontconfig的文檔,雖然很簡略,但是也提到:Xft1.0及以前的版本,需要通過XftConfig文件來配置字體,從Xft1.1以后,都采用Fontconfig來配置字體;Fontconfig的文檔也說它只負責字體的配置,不負責字體的顯示。
So,配置Linux中的字體,我們只用理會Fontconfig,還有疑問嗎?
學習Fontconfig
學習Fontconfig的最佳方式是閱讀man fonts.conf手冊頁,其次,就是閱讀/etc/fonts/conf.d目錄下的配置文件,從實例中學習。
Fontconfig的功能就是幫助應用程序選擇字體并指導字體的顯示效果(只能說指導,因為具體的顯示由Xft、Freetype等說了算),用什么策略選擇字體及用什么選項顯示字體,通過配置文件來指定。Fontconfig對配置文件進行兩遍掃描,第一遍對應用程序傳遞給Fontconfig的字體列表(稱為pattern)進行操作,通過添加、刪除、替換pattern中的字體名,讓應用程序得到相應的字體;第二遍對已經選擇的字體進行操作,這時一般不改字體名了,而是對抗鋸齒(antialias)、微調(hinting)、自動微調(autohint)、微調級別(hintstyle)以及次像素平滑(rgba)等屬性進行控制。
Fontconfig配置文件的語法,這個不用我在這里嘮叨,看man fonts.conf手冊頁即可,一點也不難,它的很多元素,如match、target、test、edit、string、bool、double、const等,本身就是自解釋的,看到這個單詞就知道它是什么意思。它的原則就是對每一個<match...>...</match>,通過<test...>...</test>來選擇要編輯的元素,然后使用<edit...>...</edit>來對該元素進行編輯。
配置Fedora 20 Fontconfig首先讀取的配置文件是/etc/fonts/fonts.conf,然后,根據/etc/fonts/fonts.conf里面的<include>...</include>信息來加載其它的配置文件。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”等,中文也可能寫成繁體“宋 主站蜘蛛池模板: 突泉县| 庆安县| 佛坪县| 清流县| 盘锦市| 资兴市| 饶平县| 孟州市| 白河县| 论坛| 荔浦县| 额尔古纳市| 安陆市| 凤翔县| 堆龙德庆县| 海阳市| 晋江市| 清镇市| 武胜县| 呼图壁县| 西华县| 佛山市| 邛崃市| 隆安县| 敦化市| 长武县| 永清县| 绵阳市| 汽车| 巫溪县| 大庆市| 开封市| 沧源| 丹凤县| 呼和浩特市| 福建省| 阿瓦提县| 钦州市| 泽州县| 重庆市| 宽城|