The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

讓你的命令提示字元或 WSL 擁有一個美麗等寬的字型設定

長久以來 Windows 的命令提示字元下都只能擁有細明體可用,而且怎樣修改預設字型都沒用,只要每次重開命令提示字元視窗,就會自動回歸醜醜的細明體字型,這對一個命令列環境的愛用者來說,實在是太痛苦了。直到今天,我終於抽絲剝繭成功找到問題的主因,並且自行製作出支援 繁體中文-台灣 (CP950) 的全新字型檔!

問題描述

先來看看我所說的這個問題是怎樣發生的:

  1. 首先,我們先打開命令提示字元視窗,大家應該很習慣看到的字型基本上就只有細明體可用,而這個原因,跟你電腦設定的預設字集有關。你可以用 chcp 命令查詢你的命令提示字元目前使用的字集為何,如下圖示。這裡的 950 或稱 CP950 ( Code Page 950 ) 正代表的是台灣常見的 Big5 字集。

    命令提示字元: chcp

  2. 當你在選擇顯示字型的時候,你會發現,雖然系統安裝了一大堆字型,但是卻大部分都選不到,中文字型的部分也只能選擇細明體而已。

    命令提示字元: 內容

    命令提示字元: 變更字型

  3. 這個問題,主要就出在「所有的字型都有設定可以支援的字集範圍」,字型本身雖然支援 Unicode 而且支援所有中文字,但如果字型檔沒有設定該字型支援哪些 non-Unicode 字集的話,在這邊就無法選取,因為電腦並不知道這個字型是否可以在命令提示字元中正常顯示文字。

  4. 要解決這個問題,你其實可以修改目前命令提示字元下的字集,只要執行 chcp 65001 就可以切換至 Unicode 模式,此時就可以選到所有支援 Unicode 的字型了。例如我想選等寬的 Consolas 字型,這時就可以看見,而且修改完之後,也確實可以套用到目前的命令提示字元介面中。

    命令提示字元: 選擇等寬的 Consolas 字型

  5. 不過,這個設定沒辦法套用在 WSL 環境下,因為在執行 bash.exe 的時候,你根本沒機會執行 chcp 65001 命令,所以當你每次重新執行命令提示字元就會回復原狀,也就是切換回 CP950 模式,同時也意味著再次切換回醜醜的細明體字型。

  6. 另外,由於最近幾次的 Windows 10 版本有對命令提示字元做出許多改進,所以如果你直接執行 cmd.exe 來啟動命令提示字元的話,預設確實會保留在 65001 (Unicode) 字集中。不過早期的 Windows 版本,也是大多數非 Windows 10 的電腦,預設字集通通都會自動切換回預設的 950 (Big5) 字集。意思也就是說,你之前所有對命令提示字元所做出的字型設定通通都會復原,全部再次改為醜醜的細明體字型。

  7. 另一方面,我最近的研究結果呈現出,只要你用 捷徑 (Shortcut) 來啟動命令提示字元,預設字元全部都會切換回 950 (Big5) 字集,無論你用哪個版本的 Windows 都一樣,所以我可以說,命令提示字元真的是一個擁有大量歷史包袱的東西,要徹底的改變命令提示字元難用的現況,真的異常艱難!

以下是我研究出來的結果整理:

  • 如果顯示語言設定為 English (United States) 的話,執行 cmd.exe 預設字集為 65001 (Unicode)

  • 如果顯示語言設定為 English (United States) 的話,執行 命令提示字元 捷徑,預設字集為 950 (Big5)

  • 如果顯示語言設定為 Chinese (Traditional) 的話,執行 cmd.exe 預設字集為 950 (Big5)

  • 如果顯示語言設定為 Chinese (Traditional) 的話,執行 命令提示字元 預設字集為 950 (Big5)

  • 如果你用 Windows 10 的話,當顯示語言設定為 Chinese (Traditional) 的話,執行 cmd.exe 預設字集為 65001 (Unicode)

  • 如果你用 Windows 10 的話,當顯示語言設定為 Chinese (Traditional) 的話,執行 命令提示字元 預設字集為 950 (Big5)

寫到這裡,你幾乎可以發現,要讓命令提示字元停留在 65001 (Unicode) 字集其實是相當困難的。但是我有一個相對簡單的處理方式,就是透過修改控制台中的地區設定來改善這個問題,直接把 非 Unicode 程式的語言 切換到 英文 (美國) 即可讓你的命令提示字元預設就停留在 65001 (Unicode) 字集,如此一來你就可以使用所有的系統字型。不過這會引發更多的問題,因為如果你修改 非 Unicode 程式的語言 切換到 英文 (美國) 的話,如果你從系統中任意程式開啟含有 Big5 字集的文字檔案,系統很有可能會因為無法判斷字集而導致無法正確顯示文字檔,你現有許多文字編輯器都將會出現無法讀取中文文字檔案的問題,因為大部分 Windows 應用程式都依賴作業系統對非 Unicode 的文字檔做出自動字集判斷。所以非常不建議大家這樣設定!

控制台: 地區

控制台: 地區 > 系統管理

控制台: 地區 > 系統管理 > 非 Unicode 程式的語言

簡言之,這個看似簡單的切換字型問題,其實相當難解!所以我才會困擾這麼多年!

解決方案

今天,我終於想通了!我只要找一個字型,字型內容包含美麗的中文字型,又包含 Mono 等寬的英文字型,然後再修改這個字型檔支援 950 字集,不就可以讓我的命令提示字元雖然用的是 950 (Big5) 字集,但卻可以使用自己選擇的字型嗎!😃

話說得簡單,重點是我根本沒有製作字型的經驗,也完全不知道怎麼開始,製作一個字型的複雜度之高,難以想像。不過,我卻發現微軟好像自己做了一個這樣的字型,我從 Visual Studio Code 的 GitHub 專案中找到一個名為 Microsoft YaHei Mono 字型檔,這個特別的字型檔幾乎可以說是完全為這個需求打造的,確實可以解決命令提示字元無法使用美麗字型的問題。不過,悲劇的是,這個從微软雅黑改良過來的中文字型,只支援 936 (GB2312) 字集而已,結論竟然是無法使用,我的老天爺啊,為什麼身為一個台灣人命運如此坎坷!

今天,我決心做出一份可以讓台灣人用的字型,所以我用了 FontForge 工具,把這個字型的字集設定給改了,改成同時支援 936 (GB2312)950 (Big5) 字集,經過測試,確實可以在設定為 950 字集下的命令提示字元成功設定這個字型,一整個命令列環境超完美,完全就是我理想中的樣子!👍

命令提示字元: chcp 950

想索取這個字型的朋友,可以直接到我的 GitHub 專案下載支援 CP950 的 Microsoft YaHei Mono 字型回去安裝!

字型下載:https://github.com/doggy8088/MicrosoftYaHeiMono-CP950/blob/master/MicrosoftYaHeiMono-CP950.ttf?raw=true

這個字型真的非常好用,他不只可以用在命令提示字元PowerShellWSL,更可以用在 Notepad2Notepad++Visual Studio CodeVisual Studio 編輯器中,字體相當美觀,而且很適合拿來當 Coding 時使用的字型!

使用 PowerShell 快速安裝字型

先安裝 Install-Font Cmdlet 所需的 PSWinGlue 模組:

# 全新電腦才需要事先執行以下命令
Set-ExecutionPolicy Bypass -Scope Process -Force
Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force

Install-Module -Name PSWinGlue -Force

  • Windows Server 2019 (將字型安裝到控制台) (All Users)

    $tmpFolder = New-TemporaryFile | %{ rm $_; mkdir $_ }
    Invoke-WebRequest -Uri "https://github.com/doggy8088/MicrosoftYaHeiMono-CP950/blob/master/MicrosoftYaHeiMono-CP950.ttf?raw=true" -OutFile "$tmpFolder\MicrosoftYaHeiMono-CP950.ttf"
    Install-Font -Scope System -Path $tmpFolder
    
    
  • Windows 10 1809+ (可以將字型安裝在目前登入的使用者目錄下)

    $tmpFolder = New-TemporaryFile | %{ rm $_; mkdir $_ }
    Invoke-WebRequest -Uri "https://github.com/doggy8088/MicrosoftYaHeiMono-CP950/blob/master/MicrosoftYaHeiMono-CP950.ttf?raw=true" -OutFile "$tmpFolder\MicrosoftYaHeiMono-CP950.ttf"
    Install-Font -Scope User -Path $tmpFolder
    
    

相關連結

留言評論