首先來個效果圖(賣個關(guān)子,本圖含有玄機(jī)……)
還有這幅圖,不知各位讀者能否觀察出與上圖的不同之處:
1. 介紹
話說微軟的控制臺程序(cmd和Powershell)默認(rèn)字體十分難看,網(wǎng)上有不少文章講怎么修改字體。大多數(shù)都是通過切換代碼頁(936到437),然后選擇一個在注冊表添加的字體。但是中文字體卻少有設(shè)定的。如果能用微軟雅黑做中文字體就好了,但是微軟雅黑定義上不是等寬字體,所以沒法直接使用。
后來不經(jīng)意間,我發(fā)現(xiàn)了Windows自己有個FontLink功能,也就是說,如果某個字體有不能顯示的字符,就用一些備用字體來替換(熟悉Java的同學(xué),記得fontconfig.properties吧)。這些可以在注冊表里設(shè)置。所以如果是使用Windows字體系統(tǒng)的程序,都可以獲得這個功能。如果把一個等寬英文字體的備選字體設(shè)為雅黑,那么只要你選擇了那個英文字體,如果有中文需要顯示,就不會出現(xiàn)框框,而是用雅黑來顯示了!
2. 操作
首先到網(wǎng)上搜索“修改cmd字體”,按照教程熟悉怎么設(shè)置英文字體(就是在注冊表里添加0 00 000這樣的鍵,然后通過修改代碼頁選擇字體)。這時應(yīng)該達(dá)到,英文用你設(shè)置的字體顯示,而中文還是默認(rèn)的宋體。如果你想完全照著我做,那么請安裝并選擇Monaco,這是蘋果出的很好看的字體。
然后我們要修改Monaco的FontLink。首先打開regedit,找到
HKLM/Software/Microsoft/Windows NT/CurrentVersion/FontLink/SystemLink
你會發(fā)現(xiàn)有很多字體名的鍵,然后你就明白為什么你選擇一個英文字體,但是輸入中文的時候仍然可以正常顯示了。現(xiàn)在我們需要自己建立一個這樣的鍵,新建字符串鍵Monaco,然后照下圖輸入:
你可能發(fā)現(xiàn),MSYH.TTF這個字體在其他的鍵里也有出現(xiàn)(例如Segoe UI),而且有兩個,第一個后面帶著兩個數(shù)字(默認(rèn)是128,96)。但是我設(shè)置成了205,154。這是什么意思呢?
一、數(shù)字是什么?如果一個英文字體不能顯示中文字體,就用它的備選字體來顯示,這時用的字號都是一樣的。但是中文和英文字號,如果相同的話,實(shí)際的大小是不同的,就顯得很不和諧。所以要給中文字體一個scaling factor,讓相應(yīng)的字體變大或者變小一些,從而和相應(yīng)的英文字體配套。
二、為什么要重復(fù)一個沒有數(shù)字的?其實(shí)這個FontLink是GDI和GDI+的功能,但是GDI+不能識別后面的數(shù)字(其實(shí)很多方面GDI+都比GDI弱爆了,嘿嘿)。所以要重復(fù)一次,GDI+找不到第一個字體,就用第二個了。
三、我為什么選擇一個不一樣的值?隨便配套兩個字體,那個factor怎么選,應(yīng)該是不同的吧,網(wǎng)上我沒找到怎么選這個的資料。我首先用默認(rèn)的128,96來試,發(fā)現(xiàn)效果就是第二張效果圖,中文感覺很矮,感覺和英文不在一個水平線上。這種現(xiàn)象我在Emacs里面也看過。在Emacs里面,Monaco和雅黑字號比是1:1.6時,一個中文正好是兩個英文的寬度,非常和諧,所以,我就把默認(rèn)的值都乘以1.6,就出來205,154了。我試過幾次,如果太大的話(比如都擴(kuò)大兩倍),就回到了一開始的狀態(tài)(第二張效果圖那樣)。所以1.6是個最適當(dāng)?shù)倪x擇。
因?yàn)檫@是GDI的特性,相當(dāng)?shù)讓樱栽O(shè)置完要重啟系統(tǒng),然后就看見效果了!
3. 討論
一開始我說,第一張效果圖內(nèi)含玄機(jī),就是同樣的字體,輸入時是等寬的,但是cmd反饋的渲染卻是不等寬的!可見cmd的字符渲染還有很多問題。有一種可能是輸出采用了雅黑字體的非等寬信息,整體比輸入時要窄。使用這個設(shè)定,在Notepad里雅黑的寬度要稍大于兩個英文字符。
其實(shí)我們這樣設(shè)置cmd,其實(shí)是繞過了cmd本身一些缺陷的hack。但是cmd現(xiàn)在可以用上很好看的字體組合,所以這點(diǎn)“瑕疵”還是可以容忍的。畢竟雅黑是個含有高級排版信息的非等寬字體啊。如果實(shí)在需要,可以把雅黑替換成幼圓。
這個設(shè)置還有一個比較好用的地方。例如Vim本身對字體的支持較弱,分別設(shè)置字體還要utf-8編碼才行,還不支持非等寬字體。所以如果使用FontLink,直接選擇Monaco作為字體,一切OK。再比如把記事本字體選為Monaco,中文自然就成了雅黑。
那么是否都以后的字體設(shè)置都省了呢?不是。只有使用Windows本身字體渲染功能的軟件可以使用這個。像Emacs這種自己動手豐衣足食的,本身對字體支持非常完善,比Windows這點(diǎn)小東西強(qiáng)大得多了去了。Java也是自己渲染字體,雖然有點(diǎn)Buggy(例如Swing顯示雅黑粗斜體的時候,居然亂碼,但是normal沒事;我估計現(xiàn)在還是這樣)。