The Will Will Web | 如何在 Windows 10 周年更新安裝 Bash on Windows 並解決中文亂碼問題

The Will Will Web

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

如何在 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 才行:

 

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

 

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

 

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

 

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

 

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

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

 

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

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

 

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

 

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

  1. 先開啟命令提示字元視窗 ( cmd )
  2. 直接執行 bash 即可啟動,在輸入 "Y" 之後就會自動下載相關檔案
  3. 接著要設定一組 Linux 帳號下必要的使用者帳號,並且輸入兩次密碼進行設定 (注意: 此時畫面上很有可能會出現亂碼),設定好之後,你會看到有「安裝成功!」字樣,就代表安裝成功了!

    設定這組帳號的目的在於讓你執行在 Linux 子系統的過程中,可以用這個 Linux 本機使用者的權限進行操作,而設定的密碼可以當作執行 sudo 命令時輸入 root 密碼之用,相關細節請參考 Bash on Ubuntu on Windows - Linux User Account and Permissions 文件說明。

    ※ 安裝好之後也有可能看到一堆亂碼,那是因為 Windows 內建的 Console 預設 CodePage 都是以 950 為主 ( Big5 編碼 ),但進入 WSL 之後的 Console 卻是以 CodePage 65001 (Unicode) 為主,在 Console 之間切換 CodePage 且畫面上又有中文的話,看見亂碼是很正常的,不過也無法解決就是了,這完全是 Windows 作業系統的歷史包袱啊!
  4. 安裝完成後,還會在開始功能表中發現【Windows 上 Ubuntu 的 Bash】應用程式捷徑

 

重新安裝 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

你也可以試試自己在命令提示字元模式下輸入 chcp 65001 命令,這段指令也會讓你直接進入 Code Page 為  65001 (Unicode) 編碼模式。

這時如果你輸入 dir 命令想列出含有中文的目錄名稱,預設可就顯示不出來了,如下圖示:

 

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

 

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

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

實驗結束!結論是:「不要再用 Windows 內建的 Console 來執行 Bash 程式

 

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

我在實驗多種可能的中文解決方案之後,已經研究出最能解決中文輸入與顯示問題的工具,就是我之前介紹過的 cmder 工具!

介紹好用工具:Cmder ( 具有 Linux 溫度的 Windows 命令提示字元工具 )

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

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

 

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

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

 

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

在 Cmder 裡面設定 alias bash 的命令如下:

alias bash=c:\windows\system32\bash.exe $*

 

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

 

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

 

結論

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

底下有許多跟 WSL 有關的連結,建議各位可以先看看介紹影片,再來深入研究 WSL 的各種應用技巧! :)

 

相關連結