一、系統自帶的cmd.exe 以及 Git的bash.exe、sh.exe、git-bash.exe和git-cmd.exe,和PowerShell默認使用“當前系統區域設置”設定好的936 (ANSI/OEM - 簡體中文 GBK)語言編碼。
1、[當前代碼頁] 的936 (ANSI/OEM - 簡體中文 GBK) 是導致中文亂碼的原因
在控制面板→區域→管理→更改系統區域設置,當前系統區域設置(C) 為:中文(簡體,中國)。其對應的語言編碼是:936 (ANSI/OEM - 簡體中文 GBK)。
系統自帶的cmd.exe 以及 Git的bash.exe、sh.exe、git-bash.exe和git-cmd.exe 和Powershell以此為依據,在注冊項CodePage設置為936。
導致“屬性”→ “選項”中,其【當前代碼頁】的編碼固定在936 (ANSI/OEM - 簡體中文 GBK)。
2、這樣會導致什么問題呢?
(1) 問題一: 【屬性】選項的【字體】無法識別自定義文字樣式,【默認值】選項可選自定義字體樣式,卻無法覆蓋【屬性】選項
【屬性】里面,【選項】的“當前代碼頁”編碼為936 (ANSI/OEM - 簡體中文 GBK)時,【字體】無法識別自定義文字樣式,比如:CaskaydiaMono NFM。此處只能選擇類似于“新宋體”、“隸書”、“楷體”等樣式。
選擇【默認值】時,雖然可以選擇自定義下載的字體,但是無法覆蓋【屬性】選項里面的字體樣式,字體的樣式還是“新宋體”
(2) 問題二:在使用git命令輸出中文時會有亂碼
因為【當前代碼頁】編碼(即控制臺編碼格式)固定在936 (ANSI/OEM - 簡體中文 GBK),而這些控制臺依賴的git.exe默認編碼格式為utf-8,由于編碼格式不一致,程序運行時往往會出現中文亂碼的情況。
此時在D:/Git/etc目錄下,往配置文件 (例如:bash.bashrc、profile、gitconfig) 中設置編碼為utf-8的語句也沒有任何作用。比如下圖:bash.bashrc中設置編碼為utf-8,對解決控制臺的中文亂碼沒有任何作用。
3、解決方法:把注冊表中Console(控制臺)的CodePage(當前代碼頁)選項的編碼修改為65001(utf-8)
(1) Win+R,輸入regedit,定位到 [計算機\HKEY_CURRENT_USER\Console\]
(2) 把常用的終端(控制臺)的CodePage設置為65001(utf-8)
有CodePage選項的,點擊【十進制】的基數,設置為65001(utf-8)。沒有CodePage選項的請自行新建。
① 系統自帶的CMD
② D:/Git/bin/bash.exe
③ D:/Git/bin/sh.exe
因為sh.exe沒有CodePage選項,我們需要右鍵→新建→DWORD(32位)值。命名該項為:CodePage。十進制值為65001。
④ D:/Git/bin/git-bash.exe 和 D:/Git/bin/git-cmd.exe
同上設置,我們需要右鍵→新建→DWORD(32位)值。命名該項為:CodePage。十進制值為65001。
⑤ 單獨使用PowerShell時,控制臺輸出中文亂碼
[1] 方法1:在Microsoft.PowerShell_profile.ps1配置文件中設置utf-8編碼
在PowerShell中輸入$profile,查看.ps1配置文件的路徑
編輯Microsoft.PowerShell_profile.ps1。在里面添加以下語句。
#8. 設置Powershell控制臺輸出結果的編碼為utf-8,解決輸出中文亂碼的問題 $OutputEncoding = [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 |
[2] 方法2:打開regedit,定位到:計算機\HKEY_CURRENT_USER\Console\。給所有PowerShell選項新建類型為DWORD(32位)值的CodePage項,點擊【基數:十進制】,寫入數值:65001 (utf-8),從源頭解決中文亂碼問題。
以上方法只能解決:[單獨使用PowerShell時,控制臺輸出中文亂碼] 的問題
⑥ 使用Terminal來掛靠PowerShell時,控制臺輸出中文亂碼
當我們使用Terminal來掛靠PowerShell時,Terminal會默認使用系統的GBK編碼,覆蓋了PowerShell在注冊表設置的CodePage值:65001(utf-8)。導致輸出到控制臺時會有中文亂碼。
按方法1的做法,不僅可以避免上述問題。單獨使用PowerShell時也會避免中文亂碼。
在PowerShell中輸入$profile,查看.ps1配置文件的路徑
編輯Microsoft.PowerShell_profile.ps1。在里面添加以下語句。
#8. 設置Powershell控制臺輸出結果的編碼為utf-8,解決輸出中文亂碼的問題 $OutputEncoding = [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 |
再次測試,不再有中文亂碼。
(3) 總結
① 對于系統自帶的cmd.exe 以及 Git的bash.exe、sh.exe、git-bash.exe和git-cmd.exe ,遇到在控制臺輸出中文亂碼的問題,建議進入regedit注冊表中,新建或修改DWORD類型的CodePage的值,統一為:65001 (utf-8)
② 單獨使用Powershell.exe,遇到在控制臺輸出中文亂碼的問題,有兩種解決方法:
方法1:通過$profile定位到.ps1配置文件,輸入以下語句:
#8. 設置Powershell控制臺輸出結果的編碼為utf-8,解決輸出中文亂碼的問題 $OutputEncoding = [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 |
方法2:進入regedit注冊表中,新建或修改DWORD類型的CodePage的值,統一為:65001 (utf-8)
③ 使用Terminal來掛靠PowerShell時,遇到在控制臺輸出中文亂碼的問題,有一種解決方法:
方法1:通過$profile定位到.ps1配置文件,輸入以下語句:
#8. 設置Powershell控制臺輸出結果的編碼為utf-8,解決輸出中文亂碼的問題 $OutputEncoding = [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 |
所以對于PowerShell來說,使用方法1可以直接解決控制臺輸出中文亂碼的問題。方法2可用可不用。不會影響方法1。兩個方法同時使用也行。