TOC

修改 cmd 字体

Command_Prompt_on_Windows_10_RTM.png

Windows CMD 太挫,中文字体选择少,XP, Win7 下只有点阵字体 (fixedsys) 和新宋体,Win10 字体又多了几个,但效果页不太好。

不过 Win10 的话,可能是半年前吧,微软新出来了一个 Windows Terminal 的虚拟终端,就现代化多了。现在我在 Windows 下(偶尔)一般都是用的新版 Terminal + PowerShell,听方便。

但如果由于 OS 版本等问题,离不开 cmd 的话,有两个方法,一个是使用第三方终端模拟器,比如 cmder;再一个就是想办法定制一下 cmd 的字体。

我在这里记录一下之前使用的一个方案失效地址(确认有效,不过好久都没有用了)。

原作者打包了几个字体 (Lucida Console, Bitstream Vera Sans Mono) 和一个 reg 文件,几个快捷方式,下载解压之后双击执行 reg 文件修改注册表,然后安装那几个字体就行了。打开不同快捷方式对应使用不同字体。

这个压缩包 (win_console_fonts.zip) 找不到了,不过大概思路还清楚,就是突破 cmd 配置的 GUI 限制,直接通过注册表增加字体选项:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont]
"0"="Lucida Console"
"932"=hex(7):2a,00,2d,ff,33,ff,20,00,b4,30,b7,30,c3,30,af,30,00,00,2a,00,4d,00,\
  53,00,20,00,47,00,6f,00,74,00,68,00,69,00,63,00,00,00,00,00
"936"=hex(7):2a,00,b0,65,8b,5b,53,4f,00,00,2a,00,4e,00,53,00,69,00,6d,00,53,00,\
  75,00,6e,00,00,00,00,00
"949"=hex(7):2a,00,74,ad,bc,b9,b4,cc,00,00,2a,00,47,00,75,00,6c,00,69,00,6d,00,\
  43,00,68,00,65,00,00,00,00,00
"950"=hex(7):2a,00,30,7d,0e,66,d4,9a,00,00,2a,00,4d,00,69,00,6e,00,67,00,4c,00,\
  69,00,55,00,00,00,00,00
"00"="Consolas"
"000"="Courier New"
"0000"="Bitstream Vera Sans Mono"

文件内容参考参考就行了。
cmd 的字体配置是和代码页编码关联,全零是默认代码页 437,美国的。
936 就对应中文环境(GBK)

临时修改:chcp 437,选择字体,然后切换回 936
永久修改:

[HKEY_CURRENT_USER\Console\%SystemRoot%_system32_cmd.exe]
"FaceName"="Bitstream Vera Sans Mono"

提示:修改注册表之前最好先备份一下相关项!!!

原文作者快捷方式不知道是做了什么操作,估计是加了什么 cmd 参数,或者在命令前面加了什么操作。

参考资料与拓展阅读

REG_BINARY      hex
REG_DWORD       dword
REG_EXPAND_SZ   hex(2)
REG_MULTI_SZ    hex(7)
import binascii
content = """
"932"=hex(7):2a,00,2d,ff,33,ff,20,00,b4,30,b7,30,c3,30,af,30,00,00,2a,00,4d,00,\
  53,00,20,00,47,00,6f,00,74,00,68,00,69,00,63,00,00,00,00,00
"936"=hex(7):2a,00,b0,65,8b,5b,53,4f,00,00,2a,00,4e,00,53,00,69,00,6d,00,53,00,\
  75,00,6e,00,00,00,00,00
"949"=hex(7):2a,00,74,ad,bc,b9,b4,cc,00,00,2a,00,47,00,75,00,6c,00,69,00,6d,00,\
  43,00,68,00,65,00,00,00,00,00
"950"=hex(7):2a,00,30,7d,0e,66,d4,9a,00,00,2a,00,4d,00,69,00,6e,00,67,00,4c,00,\
  69,00,55,00,00,00,00,00
""".strip()
for line in content.splitlines():
    print(line)
    v = ''.join(line.replace(' ', '').split(':', 1)[1].split(','))
    vv = binascii.unhexlify(v).decode('utf-16')
    print(vv)