﻿# 如何在 Windows 10 周年更新安裝 Bash on Windows 並解決中文亂碼問題

今天趁著颱風天在家，花了 10 個小時把筆電升級到 Windwos 10 周年更新版本，並且裝了一直想安裝的 Bash on Windows 套件 ( Windows Subsystem for Linux ) ( 簡稱 WSL )，裝的過程還算順利，就唯獨「中文亂碼」問題很討厭，每每遇到這種問題，我就會本能的想要徹底了解背後的原理與嘗試從根本解決問題。本篇文章就來說說如何安裝這個 WSL 套件，並設法解決中文無法正常顯示與輸入的問題。

### 安裝 WSL 套件

安裝之前你必須先確認 Windows 10 的組建版本至少要在 **14316** 之後的版本，且要確認你用的是 AMD/Intel 與 x64 架構相容的 CPU 才行：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/b79e753bbca2aab78016-image_2965.png)

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/7e3130fc22a1288a091e-image_2966.png)

我個人是比較喜歡打指令啦，你可以輸入 **ver** 來查詢版本，而且現在的新電腦很少還用 x86 架構的：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/2e82b0359149edd526af-image_2967.png)

接著按下 **Win+I** 組合鍵，開啟 **Windows 設定** 視窗，並點擊「**更新與安全性**」

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/887ee6101f2a1c5862b5-image_2968.png)

切換到「**開發人員專用**」頁籤，並切換到「**開發人員模式**」選項，第一次切換過去會安裝一些必要的應用程式，所以可能會花幾十秒的時間進行安裝，如下圖示：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/1e704f0ec856380aa30e-image_2969.png)

接著要安裝本文的重點套件，請先開啟控制台中的「程式和功能」( 快速鍵請輸入 **Win-X** 組合鍵再輸入 **F** 即可開啟 )，並點擊「**開啟或關閉 Windows 功能**」

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/25065fd80206b6bc6fef-image_2970.png)

接著你就可以找到如下圖這個套件：

-   套件名稱叫做 "**Windows Subsystem for Linux (Beta)**"
-   中文翻譯叫做 "**適用於 Linux 的 Windows 子系統 (搶鮮版 (Beta))**" ( … 我真覺得翻得很不好 … ) >"<

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/526d74e819dddb591e77-image_2971.png)

如果你喜歡輸入命令來快速安裝這個功能，可以先用系統管理員身分開啟 PowerShell 並輸入以下指令：

> **Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux**

接下來請注意，**你一定要先重新開機**，才能繼續安裝設定！

第一次使用 **Bash on Windows** 會需要先做初始化動作，所以會先花上幾分鐘的時間進行下載與設定：

1.  先開啟**命令提示字元**視窗 ( cmd )
2.  直接執行 **bash** 即可啟動，在輸入 "**Y**" 之後就會自動下載相關檔案  
    ![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/4baf04376e1a2a62359d-image_2972.png)
3.  接著要設定一組 Linux 帳號下必要的使用者帳號，並且輸入兩次密碼進行設定 (注意: 此時畫面上很有可能會出現亂碼)，設定好之後，你會看到有「安裝成功!」字樣，就代表安裝成功了！  
      
    設定這組帳號的目的在於讓你執行在 Linux 子系統的過程中，可以用這個 Linux 本機使用者的權限進行操作，而設定的密碼可以當作執行 **sudo** 命令時輸入 root 密碼之用，相關細節請參考 [Bash on Ubuntu on Windows - Linux User Account and Permissions](https://aka.ms/wslusers "https://aka.ms/wslusers") 文件說明。  
      
    ※ 安裝好之後也有可能看到一堆亂碼，那是因為 Windows 內建的 Console 預設 CodePage 都是以 950 為主 ( Big5 編碼 )，但進入 WSL 之後的 Console 卻是以 CodePage 65001 (Unicode) 為主，在 Console 之間切換 CodePage 且畫面上又有中文的話，看見亂碼是很正常的，不過也無法解決就是了，這完全是 Windows 作業系統的歷史包袱啊！  
    ![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/77bb7a19ed54c90fb022-image_2973.png)
4.  安裝完成後，還會在開始功能表中發現【**Windows 上 Ubuntu 的 Bash**】應用程式捷徑  
    ![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/c8ad589ac694797bc781-image_2974.png)

### 重新安裝 WSL 套件

如果你的 WSL 被玩爛了，例如 Linux 系統下的檔案被誤刪，或是設定錯誤導致系統功能異常，這時都很有可能需要重裝，以下我將示範重新安裝的步驟：

1.  請在 Windows 命令提示字元下執行以下命令，就可以立刻刪除 WSL 套件。當你刪除之後，之前在 WSL 中建立的檔案，安裝過的 APT 套件，全部都會自動移除乾淨，完全無副作用！  
    **lxrun /uninstall /full /y**
2.  如果要重新安裝，除了直接打 bash 就可以進入全新的 WSL 初始化工作外 (跟上述步驟一樣)，也可以用以下命令快速初始化 WSL 工作：  
    **lxrun /install /y**  
      
    ※ 請注意：這種安裝方式將會讓你在日後登入 WSL 時，也就是每次執行 bash 時，就會自動以 root 身分登入 ( 最高權限 )，而且一樣也不用輸入密碼，且在用 apt-get 安裝套件時，也不再需要使用 sudo 提升權限，雖然比較方便，但卻是比較不安全的做法，各位可以考慮清楚要用哪種方式初始化 WSL 套件。

### 解決中文亂碼問題

基本上，開啟【**Windows 上 Ubuntu 的 Bash**】應用程式有兩種方式，分別是：

-   在已開啟的 Windows 命令提示字元 ( cmd ) 下執行 **bash** 命令
-   直接從程式集中執行【**Windows 上 Ubuntu 的 Bash**】捷徑 ( 事實上等同於先開 cmd 再執行 bash )

簡單來說，Windows 作業系統內建就只有這一套 Console 工具 ( 命令提示字元 )，因此在執行 WSL 的時候，自然不像原生 Linux 終端機介面 ( Terminal Interface ) 來的這麼強大，如同本文稍早講過的「Windows 內建的 Console 預設 CodePage 都是以 950 為主 ( Big5 編碼 )，但進入 WSL 之後的 Console 卻是以 CodePage 65001 (Unicode) 為主」，只要你一進入 **bash** 環境，預設 Console 的 Code Page 一定會被轉換成 65001 ( Unicode )。如下圖示：

[![image](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/62c76289fba45800ea14-image_thumb_221.png "image")](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/91527ee11b2d0e49da99-image_2975.png)

> 你也可以試試自己在命令提示字元模式下輸入 **chcp 65001** 命令，這段指令也會讓你直接進入 Code Page 為  65001 (Unicode) 編碼模式。
> 
> 這時如果你輸入 **dir** 命令想列出含有中文的目錄名稱，預設可就顯示不出來了，如下圖示：
> 
> ![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/2282e6356089da1403c4-image_2976.png)

Console 的 Code Page 轉換成 65001 還有一個缺點，那就是「**完全無法使用 Windows 任何中文輸入法**」，也就是你無法在 WSL 環境下輸入中文字，如此一來，你就有很多工作無法執行了，畢竟我們還是很有可能需要輸入「中文字」才會真正好用！所以我在這裡先說個結論：「用 Windows 內建的 Console 執行的 bash 會無法輸入任何中文字，你將無法透過 cd 命令進入含有中文名稱的資料夾、無法用 grep 在眾多檔案中搜尋中文字、無法用 vi 編輯中文內容、無法用 find 命令搜尋中文檔名，還有好多好多遇到中文就無法做的事」。不過，這個問題我已經研究出了解法，本文稍後就會提到。

我必須先說，在 Console 中是否能顯示中文，會直接關係到 Code Page 與「字型」的選擇，如果你選擇了一個不是 TrueType 的字型檔，當你將 Console 切換到 Code Page 為  65001 的時候，很多中文字預設就無法顯示出來。我們直接來做個小實驗：

1.  我們先用 cmd 開啟命令提示字元，並檢查一下當前視窗的內容設定  
    ![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/bad9468ee45ed293e636-image_2977.png)
2.  先檢查目前的字碼頁 (Code Page) 是否為 950 ( 這是 Windows 電腦 **繁體中文 - 台灣** 的預設值 )  
    ![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/f37914bb5393afc424e9-image_2978.png)
3.  我們再看一下**字型**頁籤，你會發現我們預設選取的是「點陣字型」，這個字型可不是 TrueType 版本，任何其他的字型幾乎都是 TrueType 版本 (看圖示有兩個 T 重疊就知道是 TrueType 字型了)  
    ![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/05eb6f2fa8010514026e-image_2979.png)
4.  接著輸入 **dir** 列出含有中文的目錄，再輸入 **chcp 65001** 切換字碼頁  
    ![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/dead3628325d4f439095-image_2980.png)
5.  切換過去後，再打個 dir 顯示資夾內容，就可以發現亂碼一遍了  
    ![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/cd2cb15419029ce5a946-image_2981.png)
6.  這時我們進入 bash 並執行 ls -l 查看目錄檔案，想當然也是無法正常顯示中文檔名  
    ![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/3ecbf75c82a226243124-image_2982.png)
7.  這時我們來調整「字型」的部分，選用 TrueType 的「細明體」字型，並將大小選到 16 級，這樣畫面才能正常顯示 TrueType 字型。  
    ![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/c09cc3153305438f4c51-image_2983.png)
8.  變更字型之後，在 bash 中的中文字就正常顯示出來了，只差顯示的不夠完整而已 (只有顯示一半而已)，這個問題讓我們對 bash 徹底崩潰，既不能打中文字，連顯示中文還只能看一半 XDD  
    其實就算你不是在 bash 模式下，即便在命令提示字元下，Code Page 改成 65001 就是會讓中文顯示遇到前後中文字重疊的問題，不然就是只能顯示一半長度，不知道未來會不會解決？！  
    ![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/8a9996d6cdc092df5956-image_2984.png)

實驗結束！結論是：「**不要再用 Windows 內建的 Console 來執行 Bash 程式**」

### 最完整的 Bash on Windows 中文解決方案

我在實驗多種可能的中文解決方案之後，已經研究出最能解決中文輸入與顯示問題的工具，就是我之前介紹過的 [cmder](http://cmder.net/) 工具！

> [介紹好用工具：Cmder ( 具有 Linux 溫度的 Windows 命令提示字元工具 )](/post/2015/09/27/Useful-tool-Cmder.aspx)

事實上 Cmder 介面雖然看起來像是 Console 介面，但卻是重新開發過的 Console 版本，解決了許多 Unicode 字元顯示與輸入的問題，讓你無論在 Code Page 是 950 或 65001 都能正常顯示與輸入中文，這套 cmder 工具真的超讚，建議各位一定要安裝！

我們就直接開啟 Cmder 並直接重裝 WSL 套件：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/58f74f8db830260e93e6-image_2985.png)

接著當你輸入 **bash** 進入時，一定要特別注意一點，那就是 Cmder 本身就有內建 Cygwin 的 bash 工具，所以如果你直接打 bash 進入的話，那個可不是 WSL 套件的 bash 喔！

如果你不小心進入的話，請輸入 **exit** 退出這個工作階段。

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/9074900a60968b44bfb1-image_2986.png)

如果我們想要在 Cmder 之中使用 WSL 提供的 bash 的話，最方便的做法就是設定一組 alias 命令，讓 bash 命令可以直接去執行 WSL 提供的 **c:\\windows\\system32\\bash.exe** 程式！

> 在 Cmder 裡面設定 alias bash 的命令如下：
> 
> **alias bash=c:\\windows\\system32\\bash.exe $\***

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/1b24d75e94d6388c747a-image_2987.png)

你下次重裝 WSL或是從 Cmder 輸入 **bash** 命令進入 WSL 的 bash 環境的時候，如果你看到畫面上原本的中文字亂掉了，各位千萬不用擔心，那只是畫面還沒重新整理的關係，你直接輸入 **clear** 就可以把畫面清乾淨，之後就再也不會有亂碼了！

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/acb58fa015cab1c3a3a8-image_2988.png)

接下來你甚麼都不用操心，中文檔名可以正常顯示，中文輸入法通通可以用，你可以打指令、傳參數、開 vi 編輯、… 通通沒問題！ lol

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/ae88be6e37b394510411-image_2989.png)

### 結論

對於原本就會玩 Linux 的人來說，在 Windows 10 安裝 WSL ( Windows Subsystem for Linux ) ( 又稱 Bash on Windows ) ( 又稱 Ubuntu on Windows ) 可以替開發人員帶來許多原本 Windows 做不到或不容易做到的工作，畢竟在 Linux 世界中有太多好用的命令列玩具 (工具)，可以解決的問題五花八門，只要你會用，就可以找機會用上，無論用 find 命令來找檔案、或用 grep 找檔案中出現過的內容、或用 sed 與 awk 搜尋與取代檔案內容、… 現在通通都可以透過 WSL 提供的 Linux 環境來完成工作。

底下有許多跟 WSL 有關的連結，建議各位可以先看看[介紹影片](https://channel9.msdn.com/Events/Build/2016/P488)，再來深入研究 WSL 的各種應用技巧！ :)

**相關連結**

-   [Bash on Ubuntu on Windows 官方文件](https://aka.ms/wsldocs)

-   [Installation Guide](https://msdn.microsoft.com/zh-tw/commandline/wsl/install_guide)
-   [Frequently Asked Questions](https://msdn.microsoft.com/en-us/commandline/wsl/faq)
-   [Command Reference](https://msdn.microsoft.com/en-us/commandline/wsl/reference)
-   [Linux User Account and Permissions](https://msdn.microsoft.com/en-us/commandline/wsl/user_support)
-   [Release Notes](https://msdn.microsoft.com/en-us/commandline/wsl/release_notes)

-   部落格

-   [Bash on Ubuntu on Windows 10 Anniversary Update – Windows Subsystem for Linux](https://blogs.msdn.microsoft.com/wsl/2016/07/08/bash-on-ubuntu-on-windows-10-anniversary-update/)
-   Mike Harsh's Blog -- [Run Bash on Ubuntu on Windows](https://blogs.windows.com/buildingapps/2016/03/30/run-bash-on-ubuntu-on-windows/)
-   Scott Hanselman's Blog -- [Developers Can Run Bash And Usermode Ubuntu Linux Binaries On Windows 10](http://www.hanselman.com/blog/DevelopersCanRunBashShellAndUsermodeUbuntuLinuxBinariesOnWindows10.aspx)
-   Ubuntu News -- [Ubuntu on Windows – The Ubuntu Userspace for Windows Developers](http://insights.ubuntu.com/2016/03/30/ubuntu-on-windows-the-ubuntu-userspace-for-windows-developers/)

-   演講簡報

-   Build 2016 [Day 1 Keynote](https://channel9.msdn.com/events/build/2016/key01)
-   Build 2016 Interview with Ben Hillis, Dustin Kirkland, Russ Alexander, and Scott Hanselman -- [Linux Command Line on Windows](https://channel9.msdn.com/events/build/2016/c906?ocid=player)
-   Build 2016 Video walkthrough -- [Running Bash on Ubuntu on Windows!](https://channel9.msdn.com/events/build/2016/p488)

-   意見回饋

-   [GitHub issue tracker](https://github.com/Microsoft/BashOnWindows/issues)
-   [WSL Blog](https://blogs.msdn.microsoft.com/wsl/)
-   Command-line UserVoice portal
-   [Command-line team blog](https://blogs.msdn.microsoft.com/commandline/)

-   其他

-   [Windows Subsystem for Linux - 維基百科，自由的百科全書](https://zh.wikipedia.org/wiki/Windows_Subsystem_for_Linux)
