PowerShell與UTF8(with BOM)的迷團解答

PowerShell與UTF8(with BOM)的迷團解答

前一篇,只是因為在Write-Debug寫了幾個中文,浪費了大量的時間查找問題。後來黑大在FB留言一句:「好奇 .ps1 存成含 BOM 的 UTF8 編碼可避開錯誤嗎?」不試不知道,原來是我書讀的太少。將原本.ps1的UTF8改以UTF with BOM儲存後,在英文版Windows Server匯入含中文.ps1的Import-Module立馬成功了!

快速瞭解UTF8(with BOM)

stackoverflow有篇不錯的UTF8與UTF8 with BOM差異討論,簡單節錄一些重點:

  • UTF8基本上才是Unicode的標準。UTF8 with BOM反而不推薦。
  • BOM(Byte order mark)是說明開頭Byte順序,讓讀取器更好猜測檔案是用UTF8編碼的。

裡面有好懂的範例,資料[EF BB BF 41 42 43]

  • 在ISO-8859-1的字中:"ABC"
  • 在UTF8的字串:"ABC"

關於PowerShell的UTF8編碼

黑大對於中文編碼有很深的研究,在PowerShell裡的編碼問題對他來說應該只是小菜。

其實PowerShell的位元組順序標記文件也寫的很清楚:「在類似 Unix 的平臺上或使用 Windows 上的跨平臺編輯器建立 PowerShell 腳本,例如 Visual Studio Code,會導致使用 編碼的 UTF8NoBOM 檔案。 這些檔案可在 PowerShell 中正常運作,但如果檔案包含非 Ascii 字元,則可能會中斷Windows PowerShell。如果您需要在腳本中使用非 Ascii 字元,請使用 BOM 將它們儲存為 UTF-8。

Visual Studio的UTF8格式,加上PowerShell本身處理模式,造成前篇的錯誤。其實我覺得最好的解法是Windows Server把內建的PowerShell改為PowerShell Core,這樣就什麼編碼問題都沒有。

感謝黑大提示及文件,讓我的迷團一掃而空。

沒有留言:

張貼留言

感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。