解決Git 中文亂碼- Windows Powershell - HackMD

文章推薦指數: 80 %
投票人數:10人

預設使用UTF-8 編碼. 根據Stackoverflow 上所提到的,先來確認 [console]::OutputEncoding 、 ...       Published LinkedwithGitHub Like Bookmark Subscribe --- title:WindowsPowershell|解決Git中文亂碼 date:2022-07-10 is_modified:false disqus:cynthiahackmd image:https://i.imgur.com/kzQg3NE.png categories: -"資訊科技›開發與輔助工具" tags: -"資訊科技›開發與輔助工具" -Windows/DOS -工具安裝與部署 -Git -終端機 -"Published" --- #WindowsPowershell|解決Git中文亂碼 ######tags:|`資訊科技›開發與輔助工具`|`Windows/DOS``工具安裝與部署``Git``終端機`|`Published` {%hackmd@CynthiaChuang/Github-Page-Theme%}
最近用Windows10工作的時間比較多,因為被關在家咩。

自從上次安裝[WSL](https://hackmd.io/@CynthiaChuang/WSL-Install-and-Use-the-Ubuntu-subsystem-in-Win10/)時使用了PowerShell後,發現它可在Windows上下些常用的Linux的指令、基本可以滿足我的基本需求後,我幾乎放棄了Windows的命令提示字元。

但它有個麻煩的問題...雖然開發過程中少有用到中文,但像是我在寫網誌的時候就會用到,此時就會發現中文變成了亂碼...:cry:
不是我要說...,但diff長這樣是要我通靈喔!

##問題確認 先確認下問題,當我建立一份名為`測試.txt`的新檔案後,嘗試下達`gitstatus`與`gitdiff`會發現,涉及中文的部分都出現了亂碼。

看起來應該是編碼問題?觀察下一個字元對應到了三個編碼,感覺像是UTF-8的儲存格式,但直接沒有轉換顯示,直接就用印出來了?
不過,我如果用cat來看內文的話,一切正常:
推測兩個可能原因: 1.終端機的編碼設定 2.git的問題 第二點我不太確定,因為我在Linux上時不需要這種設定,可能需要更多的嘗試來確認問題。

所以我決定先來調整終端機的編碼設定,如果失敗了,再來研究git這邊。

##預設使用UTF-8編碼 根據[Stackoverflow](https://stackoverflow.com/questions/57131654/using-utf-8-encoding-chcp-65001-in-command-prompt-windows-powershell-window)上所提到的,先來確認`[console]::OutputEncoding`、`[console]::InputEncoding`、`$OutputEncoding`這三個變數:
可以發現`[console]::OutputEncoding`、`[console]::InputEncoding`兩個變數的顯示是使用Big5: 不過`$OutputEncoding`這個變數結果卻呈現UTF-8。

兩個跟Output相關的編碼,一個呈現Big5、一個用UTF-8,所以現在是歸誰管?
最後還是決定先繼續往下做,先把==所有編碼都改成UTF-8再說==。

所以接下來先來查查,個人設定檔的配置路徑,這個值可以藉由`$PROFILE`變數得知: 根據所查到的路徑前往修改檔案,如果`Microsoft.PowerShell_profile.ps1`檔案不存在就直接建立一個,並添增下列內容: ```bash= $OutputEncoding=[console]::InputEncoding=[console]::OutputEncoding=[Text.UTF8Encoding]::UTF8 ```
完成後啟動一個新的視窗,理論上預設編碼就都會呈現UTF-8了。


題外話,那天跟同事討論了**踩坑排行榜**,雖然我不像前面兩位同事是踩坑專業戶,該踩得、不該踩得坑全都一個不落;但該掉的坑我似乎也沒有幸運躲過,你看這不就來一個錯誤訊息了嗎? 在我修改完個人設定檔後,重啟PowerShell時跳出了下列錯誤訊息:
查了下原因,發現是因為是Windows執行安全性設置所導致的,在PowerShell預設的執行原則是**Restricted**,也就是限制原則,它**阻止所有script的運行**,包含剛剛的PowerShell配置文件(.ps1)。

所以需要藉由`Set-ExecutionPolicy`指令重新調整執行原則,相關指令設置說明的說明可以看[這裡](https://docs.microsoft.com/zh-tw/powershell/module/microsoft.powershell.core/about/about_execution_policies?view=powershell-7.2#powershell-execution-policies)。

這邊我們把執行原則上調到==RemoteSigned==,它可以**不需要簽署就執行在本機所撰寫的script**,但若是從下載的script就必須經過簽署後才可執行。

喔,對了`Set-ExecutionPolicy`這條指令的執行,必須具備**系統管理員身份**。

所以我又重起了一個以系統管理員身份執行的PowerShell,並按`A`同意變更執行原則:
修改完成後,再次看看diff結果,結果仍然是亂碼:cry: 不過cat指令的結果依舊正常,我還疑這部分應該是`$OutputEncoding`所控制的,就是我系統一開始就呈現UTF-8的那個變數。

##設定gitencoding 查了下,其實我的中心思想沒有錯,設定好UTF-8編碼即可。

不過好像GitforWindows內建的git.exe工具,是走UNIX-like作業系統環境下,所以非英語系語言的文字要另外設定。

這點git可以直接透過指令將編碼調整成UTF-8 ```bash= #encodingofstatusoutput $gitconfig--globalcore.quotepathfalse #GUIencoding $gitconfig--globalgui.encodingutf-8 #encodingofcommitmessages $gitconfig--globali18n.commit.encodingutf-8 #encodingoflogoutputs $gitconfig--globali18n.logoutputencodingutf-8 ```
這時看看status,可以正常顯示檔名了: 但是涉及log、diff跟使用者名稱的中文還是亂碼: ###設定`LESSCHARSET`環境變數 這時需要再設定`LESSCHARSET`環境變數,用於設定characterset: ```bash= #Gitusesthelesspagerbydefault.ThiscommandistoconverttheencodingoflesscommandstoUTF-8. $exportLESSCHARSET=utf-8 ``` 不過export的設法僅顯於目前這個process,一旦重啟視窗設定就會跳掉,所以如果要永久生效的話,還是要取改剛剛的`Microsoft.PowerShell_profile.ps1`。

直接在最後加上 ```bash= $env:LESSCHARSET='utf-8' ``` 最後再試試看指令,終於能正常呈現了:
是說,如果是設定git指令可以解掉大半,那麼在命令提示字元上效果應該也是可行的?果不其然,在命令提示字元上,status已經正常顯示,而log、diff跟使用者名稱則還是亂碼。

因此這個時候,僅需設定命令提示字元上的`LESSCHARSET`即可。

命令提示字元的變數的話,就要去改**登錄編輯程式**,這可以直接從搜尋欄輸入**regedit**叫出。

然後依序尋找`HKEY_LOCAL_MACHINE`>`Software`>`Microsoft`>`CommandProcesso`,並新增變數: ###設定`LC_ALL` 如果不設定`LESSCHARSET`環境變數,另一個方法是改設定`LC_ALL`語言環境變數,得益於git是UNIX-like的,所以這方法也可行。

```bash= $SETLC_ALL=C.UTF-8 ``` 如果要每次啟動都生效的話,就改用: ```bash= $SETXLC_ALLC.UTF-8 ```
完成後,就可以看到顯靈結果啦!再也不用通靈看diff了: ##參考資料 1.MichelleChen(2021-12-20)。

[[Windows]程式設計教學:使用PowerShell](https://opensourcedoc.com/windows-programming/powershell/)。

檢自開源技術教學網(2022-06-24)。

2.協同撰寫。

[PowerShell](https://zh.wikipedia.org/wiki/PowerShell)。

檢自維基百科(2022-06-24)。

3.NeilTsai(2020-02-21)。

[CommandPrompt/WindowsPowershell預設使用UTF-8編碼(Windows10)](https://www.thinkinmd.com/post/2020/02/21/command-prompt-and-windows-powershell-default-use-utf-8/)。

檢自ThinkinMarkdown(2022-06-24)。

4.Ray(2021-01-06)。

[解決Windows上輸入指令出現「因為這個系統上已停用指令碼執行,所以無法載入...」的問題](https://israynotarray.com/other/20200510/1067127387/)。

檢自是Ray不是Array(2022-06-24)。

5.sysin(2021-11-21)。

[Windows10环境变量:通过CMD和PowerShell写入环境变量](https://sysin.org/blog/windows-env/)。

檢自SYStemINside(2022-06-24)。

6.(2021-11-21)。

[SettingtheEncodingonWindows](https://support.huaweicloud.com/intl/en-us/usermanual-codehub/devcloud_hlp_0954.html)。

檢自HUAWEICLOUD(2022-06-24)。

##更新紀錄 :::spoiler最後更新日期:2022-07-10 -2022-07-10發布 -2022-07-10完稿 -2022-06-24起稿 :::

>**本文作者**:辛西亞.Cynthia >**本文連結**:[辛西亞的技能樹](https://cynthiachuang.github.io/Solve-that-Mandarin-Characters-Will-Be-Garbled-When-Using-Git-Command-in-Powershell/)/[hackmd版本](https://hackmd.io/@CynthiaChuang/Solve-that-Mandarin-Characters-Will-Be-Garbled-When-Using-Git-Command-in-Powershell) >**版權聲明**:部落格中所有文章,均採用[姓名標示-非商業性-相同方式分享4.0國際](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.en)(CCBY-NC-SA4.0)許可協議。

轉載請標明作者、連結與出處! × Signin Email Password Forgotpassword or Byclickingbelow,youagreetoourtermsofservice. SigninviaFacebook SigninviaTwitter SigninviaGitHub SigninviaDropbox NewtoHackMD?Signup


請為這篇文章評分?