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

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

### 問題描述

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

1.  首先，我們先打開**命令提示字元**視窗，大家應該很習慣看到的字型基本上就只有**細明體**可用，而這個原因，跟你電腦設定的**預設字集**有關。你可以用 `chcp` 命令查詢你的命令提示字元目前使用的字集為何，如下圖示。這裡的 950 或稱 CP950 ( Code Page 950 ) 正代表的是台灣常見的 Big5 字集。
    
    ![命令提示字元: chcp](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/c8ac393d7c94eb747bb5-image_3069.png)
    
2.  當你在選擇顯示字型的時候，你會發現，雖然系統安裝了一大堆字型，但是卻大部分都選不到，中文字型的部分也只能選擇**細明體**而已。
    
    ![命令提示字元: 內容](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/6f9090b4c37be4e75769-image_3070.png)
    
    ![命令提示字元: 變更字型](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/d077cc0276e0cba43aec-image_3071.png)
    
3.  這個問題，主要就出在「**所有的字型都有設定可以支援的字集範圍**」，字型本身雖然支援 Unicode 而且支援所有中文字，但如果字型檔沒有設定該字型支援哪些 non-Unicode 字集的話，在這邊就無法選取，因為電腦並不知道這個字型是否可以在命令提示字元中正常顯示文字。
    
4.  要解決這個問題，你其實可以修改目前**命令提示字元**下的字集，只要執行 `chcp 65001` 就可以切換至 Unicode 模式，此時就可以選到所有支援 Unicode 的字型了。例如我想選等寬的 Consolas 字型，這時就可以看見，而且修改完之後，也確實可以套用到目前的**命令提示字元**介面中。
    
    ![命令提示字元: 選擇等寬的 Consolas 字型](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/1f3547b1083bda50bf20-image_3072.png)
    
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 的文字檔做出自動字集判斷。**所以非常不建議大家這樣設定！**

![控制台: 地區](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/95b90650150978294ade-image_3073.png)

![控制台: 地區 > 系統管理](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/b6ece01bfb4fd704185d-image_3074.png)

![控制台: 地區 > 系統管理 > 非 Unicode 程式的語言](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/e8c9e0079b373b11f821-image_3075.png)

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

### 解決方案

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

話說得簡單，重點是我根本沒有**製作字型**的經驗，也完全不知道怎麼開始，製作一個字型的複雜度之高，難以想像。不過，我卻發現微軟好像自己做了一個這樣的字型，我從 Visual Studio Code 的 GitHub 專案中找到一個名為 [Microsoft YaHei Mono](https://github.com/Microsoft/vscode/files/555425/yahei_mono.zip) 字型檔，這個特別的字型檔幾乎可以說是完全為這個需求打造的，確實可以解決命令提示字元無法使用美麗字型的問題。不過，悲劇的是，這個從[微软雅黑](https://zh.wikipedia.org/zh-hant/%E5%BE%AE%E8%BD%AF%E9%9B%85%E9%BB%91)改良過來的中文字型，只支援 `936 (GB2312)` 字集而已，結論竟然是無法使用，我的老天爺啊，為什麼身為一個台灣人命運如此坎坷！

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

![命令提示字元: chcp 950](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/acfa4c35e4ea55043b33-image_3076.png)

想索取這個字型的朋友，可以直接到[我的 GitHub 專案](https://github.com/doggy8088/MicrosoftYaHeiMono-CP950)下載[支援 CP950 的 Microsoft YaHei Mono 字型](https://github.com/doggy8088/MicrosoftYaHeiMono-CP950/blob/master/MicrosoftYaHeiMono-CP950.ttf?raw=true)回去安裝！

字型下載：[https://github.com/doggy8088/MicrosoftYaHeiMono-CP950/blob/master/MicrosoftYaHeiMono-CP950.ttf?raw=true](https://github.com/doggy8088/MicrosoftYaHeiMono-CP950/blob/master/MicrosoftYaHeiMono-CP950.ttf?raw=true "https://github.com/doggy8088/MicrosoftYaHeiMono-CP950/blob/master/MicrosoftYaHeiMono-CP950.ttf?raw=true")

這個字型真的非常好用，他不只可以用在**命令提示字元**、**PowerShell** 或 **WSL**，更可以用在 [Notepad2](http://www.flos-freeware.ch/notepad2.html)、[Notepad++](https://notepad-plus-plus.org/)、[Visual Studio Code](https://code.visualstudio.com/) 或 [Visual Studio](https://www.visualstudio.com/) 編輯器中，字體相當美觀，而且很適合拿來當 Coding 時使用的字型！

### 使用 PowerShell 快速安裝字型

先安裝 `Install-Font` Cmdlet 所需的 [PSWinGlue](https://www.powershellgallery.com/packages/PSWinGlue) 模組：

```powershell
# 全新電腦才需要事先執行以下命令
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)
    
    ```powershell
    $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+ (可以將字型安裝在目前**登入的使用者**目錄下)
    
    ```powershell
    $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
    ```
    

### 相關連結

-   GitHub Repo
    -   [doggy8088/MicrosoftYaHeiMono-CP950: 支援 CP950 的微軟雅黑字型搭配等寬英文 (Mono) 的混和字型](https://github.com/doggy8088/MicrosoftYaHeiMono-CP950)
-   Font Operation
    -   [FontForge Open Source Font Editor](http://fontforge.github.io)
    -   [Merging two fonts - Super User](https://superuser.com/questions/490922/merging-two-fonts)
    -   [Combining TTF fonts with fontforge - YouTube](https://www.youtube.com/watch?v=zCNbA7JFbps)
-   Others
    -   [微软雅黑 - 维基百科，自由的百科全书](https://zh.wikipedia.org/wiki/%E5%BE%AE%E8%BD%AF%E9%9B%85%E9%BB%91)
    -   [Code Page Identifiers (Windows)](https://msdn.microsoft.com/en-us/library/windows/desktop/dd317756.aspx)
    -   [when locale != 437 (english-US) the change of font can't persist(Still have problem) · Issue #1994 · Microsoft/WSL](https://github.com/Microsoft/WSL/issues/1994)
