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 的各種應用技巧! :)

 

相關連結