關於字元編碼- PowerShell - Microsoft Learn
文章推薦指數: 80 %
如果您需要在腳本中使用非Ascii 字元,請使用BOM 將它們儲存為UTF-8。
如果沒有BOM,Windows PowerShell將腳本誤譯為在舊版「ANSI」 字碼頁中編碼。
跳到主要內容
已不再支援此瀏覽器。
請升級至MicrosoftEdge,以利用最新功能、安全性更新和技術支援。
下載MicrosoftEdge
InternetExplorer和MicrosoftEdge的詳細資訊
目錄
結束焦點模式
閱讀英文
儲存
目錄
閱讀英文
儲存
列印
Twitter
LinkedIn
Facebook
電子郵件
目錄
about_Character_Encoding
發行項
09/27/2022
2位參與者
本文內容
簡短描述
描述PowerShell如何使用字元編碼來輸入及輸出字串資料。
完整描述
Unicode是全球字元編碼標準。
系統會獨佔使用Unicode進行字元和字串操作。
如需Unicode所有層面的詳細描述,請參閱Unicode標準。
Windows支援Unicode和傳統字元集。
傳統字元集,例如Windows字碼頁,使用8位值或8位值的組合來代表特定語言或地理區域設定中使用的字元。
PowerShell預設會使用Unicode字元集。
不過,數個Cmdlet都有Encoding參數,可指定不同字元集的編碼方式。
此參數可讓您選擇與其他系統和應用程式互通性所需的特定字元編碼。
下列Cmdlet具有Encoding參數:
Microsoft.PowerShell.Management
Add-Content
Get-Content
Set-Content
Microsoft.PowerShell.Utility
Export-Clixml
Export-Csv
Export-PSSession
Format-Hex
Import-Csv
Out-File
Select-String
Send-MailMessage
位元組順序標記
位元組順序標記(BOM)是檔案或文字資料流程前幾個位元組的Unicode簽章,指出用於資料的Unicode編碼方式。
如需詳細資訊,請參閱位元組順序標記檔。
在WindowsPowerShell中,除了以外的UTF7任何Unicode編碼方式,一律會建立BOM。
PowerShell(v6和更新版本)預設utf8NoBOM為所有文字輸出。
若要獲得最佳整體相容性,請避免在UTF-8檔案中使用BOM。
Windows平臺上也使用Unix平臺和Unix-heritage公用程式不支援BOM。
同樣地,UTF7應該避免編碼。
UTF-7不是標準Unicode編碼,而且會在所有版本的PowerShell中沒有BOM來撰寫。
在類似Unix的平臺上或使用Windows上的跨平臺編輯器建立PowerShell腳本,例如VisualStudioCode,會導致使用編碼的UTF8NoBOM檔案。
這些檔案可在PowerShell中正常運作,但如果檔案包含非Ascii字元,則可能會中斷WindowsPowerShell。
如果您需要在腳本中使用非Ascii字元,請使用BOM將它們儲存為UTF-8。
如果沒有BOM,WindowsPowerShell將腳本誤譯為在舊版「ANSI」字碼頁中編碼。
相反地,具有UTF-8BOM的檔案在類似Unix的平臺上可能會有問題。
許多Unix工具,例如cat、sed、awk和某些編輯器,例如gedit不知道如何處理BOM。
WindowsPowerShell中的字元編碼
在PowerShell5.1中,Encoding參數支援下列值:
Ascii使用Ascii(7位)字元集。
BigEndianUnicode使用UTF-16搭配位元組位元組順序。
BigEndianUTF32使用UTF-32搭配位元組大到小的順序。
Byte將一組字元編碼為位元組序列。
Default使用對應至系統使用中字碼頁的編碼,(通常是ANSI)。
Oem使用對應至系統目前OEM字碼頁的編碼方式。
String:與Unicode相同。
Unicode使用UTF-16搭配位元組位元組順序。
Unknown:與Unicode相同。
UTF32使用UTF-32搭配位元組位元組順序。
UTF7使用UTF-7。
UTF8使用UTF-8(搭配BOM)。
一般而言,WindowsPowerShell預設會使用UnicodeUTF-16LE編碼。
不過,WindowsPowerShell中Cmdlet所使用的預設編碼方式不一致。
注意
使用除了以外的任何Unicode編碼UTF7方式,一律會建立BOM。
針對將輸出寫入檔案的Cmdlet:
Out-File和重新導向運算子>並>>建立UTF-16LE,這與和Add-Content明顯不同Set-Content。
New-ModuleManifest和Export-CliXml也會建立UTF-16LE檔案。
當目標檔案是空的或不存在時,Set-Content並使用Add-ContentDefault編碼。
Default是使用中系統地區設定的ANSI舊版字碼頁所指定的編碼方式。
Export-Csv會Ascii建立檔案,但在使用Append參數時使用不同的編碼方式(請參閱下列)。
Export-PSSession預設會建立具有BOM的UTF-8檔案。
New-Item-TypeFile-Value會建立無BOM的UTF-8檔案。
Send-MailMessage預設會使用Default編碼。
Start-Transcript使用Utf8BOM建立檔案。
使用Append參數時,編碼方式可能不同,(請參閱下列)。
針對附加至現有檔案的命令:
Out-File-Append和重新>>導向運算子不會嘗試比對現有目標檔案內容的編碼方式。
除非使用Encoding參數,否則它們會改用預設編碼。
附加內容時,您必須使用檔案原始編碼。
如果沒有明確的Encoding參數,Add-Content會偵測現有的編碼,並自動將它套用至新的內容。
如果現有的內容沒有BOM,Default則會使用ANSI編碼。
的行為在PowerShell(v6和)更新版本中的行為Add-Content相同,但預設編碼方式為Utf8。
Export-Csv-Append當目標檔案包含BOM時,會比對現有的編碼方式。
如果沒有BOM,它會使用Utf8編碼。
Start-Transcript-Append符合包含BOM之檔案的現有編碼方式。
如果沒有BOM,則預設為Ascii編碼。
當文字記錄中的資料包含多位元組字元時,此編碼可能會導致資料遺失或字元損毀。
對於缺少BOM時讀取字串資料的Cmdlet:
Get-Content和Import-PowerShellDataFile會Default使用ANSI編碼。
ANSI也是PowerShell引擎從檔案讀取原始程式碼時所使用的專案。
Import-Csv、Import-CliXml、和Select-String假設Utf8缺少BOM。
PowerShell中的字元編碼
在PowerShell(v6和更新版本)中,Encoding參數支援下列值:
ascii:使用ASCII(7位)字元集的編碼方式。
bigendianunicode:使用大位元組位元組順序以UTF-16格式編碼。
oem:使用MS-DOS和主控台程式的預設編碼方式。
unicode:使用位元組由小到大的順序,以UTF-16格式編碼。
utf7:以UTF-7格式編碼。
utf8:以UTF-8格式編碼,(沒有BOM)。
utf8BOM:使用位元組順序標記(BOM)以UTF-8格式編碼
utf8NoBOM:以UTF-8格式編碼,不含位元組順序標記(BOM)
utf32:以UTF-32格式編碼。
所有輸出的PowerShell預設為utf8NoBOM。
從PowerShell6.2開始,Encoding參數也允許已註冊字碼頁的數值識別碼,(例如-Encoding1251)或已註冊字碼頁的字串名稱(,例如-Encoding"windows-1251")。
如需詳細資訊,請參閱Encoding.CodePage的.NET檔。
變更預設編碼
PowerShell有兩個預設變數,可用來變更預設編碼行為。
$PSDefaultParameterValues
$OutputEncoding
如需詳細資訊,請參閱about_Preference_Variables。
從PowerShell5.1開始,重新導向運算子會(>並>>)呼叫Out-FileCmdlet。
因此,您可以使用喜好設定變數的預設編碼方式$PSDefaultParameterValues,如下列範例所示:
$PSDefaultParameterValues['Out-File:Encoding']='utf8'
使用下列語句來變更具有Encoding參數之所有Cmdlet的預設編碼方式。
$PSDefaultParameterValues['*:Encoding']='utf8'
重要
將此命令放在PowerShell設定檔中,可讓喜好設定成為會影響未明確指定編碼之所有命令和腳本的會話全域設定。
同樣地,您應該在想要以相同方式運作的腳本或模組中包含這類命令。
使用這些命令可確保Cmdlet的運作方式相同,即使其他使用者在不同的電腦上或不同版本的PowerShell上執行也一樣。
自動變數$OutputEncoding會影響PowerShell用來與外部程式通訊的編碼方式。
它不會影響輸出重新導向運算子和PowerShellCmdlet用來儲存至檔案的編碼方式。
另請參閱
about_Preference_Variables
位元組順序符號
字碼頁-Win32應用程式
Encoding.CodePage
.NET中的字元編碼簡介
TheUnicodeStandard
UTF-16LE
本文內容
延伸文章資訊
- 1PowerShell 輸出結果編碼問題 - 黑暗執行緒
之前研究PowerShell 中文編碼問題有個結論- Windows 10 內建PowerShell 5.1,在中文版Windows 預設用BIG5 編碼,PowerShell 6.0 之後會預...
- 2Command Prompt / Windows Powershell 預設使用UTF-8 編碼 ...
此文主要協助各位調整Command Prompt / Windows Powershell 預設使用UTF-8 編碼,有興趣就往下看吧! 本篇目錄[隱藏]. 前言; 臨時修改; 永久修改. Co...
- 3解決Git 中文亂碼- Windows Powershell - HackMD
預設使用UTF-8 編碼. 根據Stackoverflow 上所提到的,先來確認 [console]::OutputEncoding 、 ...
- 4如何寫批次檔自動big5 轉utf-8 檔案格式 - iT 邦幫忙
譬如設定好 SourcePath: D:\1 DestinationPath: D:\2. Encoding:utf8. 執行完結果就產出在D:\2. 小弟完全沒寫過powershell 有試著...
- 5Changing PowerShell's default output encoding to UTF-8
Note: The next section applies primarily to Windows PowerShell. See the section after it for the ...