使用Monaco和微软雅黑字体美化cmd和PowerShell
首先来个效果图(卖个关子,本图含有玄机……)
还有这幅图,不知各位读者能否观察出与上图的不同之处:
1. 介绍
话说微软的控制台程序(cmd和Powershell)默认字体十分难看,网上有不少文章讲怎么修改字体。大多数都是通过切换代码页(936到437),然后选择一个在注册表添加的字体。但是中文字体却少有设定的。如果能用微软雅黑做中文字体就好了,但是微软雅黑定义上不是等宽字体,所以没法直接使用。
后来不经意间,我发现了Windows自己有个FontLink功能,也就是说,如果某个字体有不能显示的字符,就用一些备用字体来替换(熟悉Java的同学,记得fontconfig.properties吧)。这些可以在注册表里设置。所以如果是使用Windows字体系统的程序,都可以获得这个功能。如果把一个等宽英文字体的备选字体设为雅黑,那么只要你选择了那个英文字体,如果有中文需要显示,就不会出现框框,而是用雅黑来显示了!
2. 操作
首先到网上搜索“修改cmd字体”,按照教程熟悉怎么设置英文字体(就是在注册表里添加0 00 000这样的键,然后通过修改代码页选择字体)。这时应该达到,英文用你设置的字体显示,而中文还是默认的宋体。如果你想完全照着我做,那么请安装并选择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没事;我估计现在还是这样)。