2022年3月12日 星期六

Powershell 的編碼問題 CodePage 如何更改

Powershell 的編碼問題 CodePage 如何更改

CodePage 如何更改

這個有分兩個終端機,一個是 Windwos11 的 Terminal 跟傳統介面的 PowerShell。基本上沒區別。只是 Terminal 沒辦法看右鍵內容看 Code Page 了,但是不影響變更的方法。

右鍵內容可以看到的 Code Page 也就是下圖這個


這是綁死跟著 Windwos 系統的 Encoding 的,沒有辦法變更除非到控制台內更改整台電腦的 Encoding 編碼,副作用可能有點大建議是不要。



另一個辦法是從終端機下手,可以暫時修改 Encoding 下次重開會被恢復。

總共要改三個變數,可以用一行連續等於同時變更

# 修改為日文 SHIFT-JIS
$OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding = [System.Text.Encoding]::GetEncoding(932)

# 修改為日文 UTF-8
$OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding = [System.Text.Encoding]::GetEncoding("UTF-8")

到這一步就可以正確的解碼了,測試的方式可以打這行把日文複製到剪貼簿。

"このように日本語が化けています。"|clip

然後再直接貼上,如果沒有變成亂碼就是正常了。




讀寫檔案

只不過還要注意一個坑是有些函式比如說 Get-Content 預設是認系統 Encoding 而不是終端機的。

而且在 Pwsh5 中是無法變更的其他語系的,只能變更成帶BOM的UTF-8,和其他少數幾個。替代的方案是使用 .Net 的函式,才能正確的讀寫 UTF-8 或其他語系的檔案。

或是乾脆升級到 Pwsh7 可以解決這個問題 Get-Content 預設是 UTF-8 且能夠自由設置其他語系的編碼。

# 編碼
$Enc_Default = [Text.Encoding]::Default
$Enc_UTF8_BOM = [Text.Encoding]::GetEncoding("UTF-8")
$Enc_UTF8 = New-Object System.Text.UTF8Encoding $False
$Enc_BIG5 = [Text.Encoding]::GetEncoding(950)
$Enc_SIFT = [Text.Encoding]::GetEncoding(932)

# 讀寫檔案
$Encoding = $Enc_UTF8
[System.IO.File]::ReadAllLines($Path, $Content, $Encoding);
[System.IO.File]::WriteAllLines($Path, $Content, $Encoding);

關於讀寫文件詳細可以看這篇的說明
https://charlottehong.blogspot.com/2021/04/powershell-bom-utf-8.html




打開 PowerShell 自動執行變更代碼

這個可能是對系統侵害性比較小的作法,從 ProFile 檔案設定每次開啟時自動執行。

if (!(Test-Path -Path $PROFILE )) { New-Item -Type File -Path $PROFILE -Force }notepad $PROFILE

如果不存在的話會自動建立,然後把剛剛那個連續三個等於的貼上存檔即可。啟動的時候會自動執行這份文件中的代碼。





沒有留言:

張貼留言