在終端、cmd、編輯器中偶爾會有中文字符出現,Windows下默認的點陣字體「宋體」和等寬英文字符放在一起非常違和。一個解決方法是下載混合字體,比如「Consolas + YAHEI hybrid」,「Source Code Pro + YAHEI hybrid」。但是這些字體組合畢竟有限,如果想用「Anonymous Pro + 幼圓」、或者更改字重、使用斜體該怎么辦呢?這時便要用到注冊表的FontLink功能了。
FontLink,顧名思義,是將某個字體未包含的字符映射到另一個字體上。比如編輯器中設定默認字體是「Consolas」,如果文件中有漢字字符,Windows本來默認顯示為「宋體」,但是FontLink設置了「雅黑」,便可以用「雅黑」來顯示。
以「Consolas + 雅黑」為例,下面是實現方法:
- 按下
Win+R打開「運行」,輸入regedit點擊確定,開啟「注冊表」; -
定位到如下位置;
-
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontLink\SystemLink
- 找到
Consolas項,雙擊打開,在「數值數據」文本框內輸入以下內容后點擊確定; -
MSYH.TTF,205,154 MSYH.TTF
- 注銷或重啟計算機
用Monaco和微軟雅黑字體美化cmd和PowerShell
Windows自己有個FontLink功能,也就是說,如果某個字體有不能顯示的字符,
就用一些備用字體來替換(熟悉Java的同學,記得fontconfig.properties吧)。
這些可以在注冊表里設置。所以如果是使用Windows字體系統的程序,都可以獲得這個功能。
如果把一個等寬英文字體的備選字體設為雅黑,那么只要你選擇了那個英文字體,
如果有中文需要顯示,就不會出現框框,而是用雅黑來顯示了!
請安裝並選擇Monaco,這是蘋果出的很好看的字體。
然后我們要修改Monaco的FontLink。首先打開regedit,找到
HKLM/Software/Microsoft/Windows NT/CurrentVersion/FontLink/SystemLink
你會發現有很多字體名的鍵,然后你就明白為什么你選擇一個英文字體,但是輸入中文的時候仍然可以正常顯示了。
現在我們需要自己建立一個這樣的鍵,新建字符串鍵Monaco,然后照下圖輸入:

你可能發現,MSYH.TTF這個字體在其他的鍵里也有出現(例如Segoe UI),而且有兩個,第一個后面帶着兩個數字(默認是128,96)。但是我設置成了205,154。這是什么意思呢?
一、數字是什么?如果一個英文字體不能顯示中文字體,就用它的備選字體來顯示,這時用的字號都是一樣的。但是中文和英文字號,如果相同的話,實際的大小是不同的,就顯得很不和諧。所以要給中文字體一個scaling factor,讓相應的字體變大或者變小一些,從而和相應的英文字體配套。
二、為什么要重復一個沒有數字的?其實這個FontLink是GDI和GDI+的功能,但是GDI+不能識別后面的數字(其實很多方面GDI+都比GDI弱爆了,嘿嘿)。所以要重復一次,GDI+找不到第一個字體,就用第二個了。
三、我為什么選擇一個不一樣的值?隨便配套兩個字體,那個factor怎么選,應該是不同的吧,網上我沒找到怎么選這個的資料。我首先用默認的128,96來試,發現效果就是第二張效果圖,中文感覺很矮,感覺和英文不在一個水平線上。這種現象我在Emacs里面也看過。在Emacs里面,Monaco和雅黑字號比是1:1.6時,一個中文正好是兩個英文的寬度,非常和諧,所以,我就把默認的值都乘以1.6,就出來205,154了。我試過幾次,如果太大的話(比如都擴大兩倍),就回到了一開始的狀態(第二張效果圖那樣)。所以1.6是個最適當的選擇。
因為這是GDI的特性,相當底層,所以設置完要重啟系統,然后就看見效果了!
3. 討論
一開始我說,第一張效果圖內含玄機,就是同樣的字體,輸入時是等寬的,但是cmd反饋的渲染卻是不等寬的!可見cmd的字符渲染還有很多問題。有一種可能是輸出采用了雅黑字體的非等寬信息,整體比輸入時要窄。使用這個設定,在Notepad里雅黑的寬度要稍大於兩個英文字符。
其實我們這樣設置cmd,其實是繞過了cmd本身一些缺陷的hack。但是cmd現在可以用上很好看的字體組合,所以這點“瑕疵”還是可以容忍的。畢竟雅黑是個含有高級排版信息的非等寬字體啊。如果實在需要,可以把雅黑替換成幼圓。
這個設置還有一個比較好用的地方。例如Vim本身對字體的支持較弱,分別設置字體還要utf-8編碼才行,還不支持非等寬字體。所以如果使用FontLink,直接選擇Monaco作為字體,一切OK。再比如把記事本字體選為Monaco,中文自然就成了雅黑。
那么是否都以后的字體設置都省了呢?不是。只有使用Windows本身字體渲染功能的軟件可以使用這個。像Emacs這種自己動手豐衣足食的,本身對字體支持非常完善,比Windows這點小東西強大得多了去了。Java也是自己渲染字體,雖然有點Buggy(例如Swing顯示雅黑粗斜體的時候,居然亂碼,但是normal沒事;我估計現在還是這樣)。
