-
Export-Clixml
-
Export-Csv
-
Export-PSSession
-
Format-Hex
-
Import-Csv
-
Out-File
-
Select-String
-
Send-MailMessage
位元組順序標記
位元組順序標記 (BOM) 是檔案或文字資料流程前幾個位元組的
Unicode 簽
章,指出用於資料的 Unicode 編碼方式。 如需詳細資訊,請參閱
位元組順序標記
檔。
在 Windows PowerShell 中,除了 以外的
UTF7
任何 Unicode 編碼方式,一律會建立 BOM。 PowerShell (v6 和更新版本) 預設
utf8NoBOM
為 所有文字輸出。
若要獲得最佳整體相容性,請避免在 UTF-8 檔案中使用 BOM。 Windows 平臺上也使用 Unix 平臺和 Unix-heritage 公用程式不支援 BOM。
同樣地,
UTF7
應該避免編碼。 UTF-7 不是標準 Unicode 編碼,而且會在所有版本的 PowerShell 中沒有 BOM 來撰寫。
在類似 Unix 的平臺上或使用 Windows 上的跨平臺編輯器建立 PowerShell 腳本,例如 Visual Studio Code,會導致使用 編碼的
UTF8NoBOM
檔案。 這些檔案可在 PowerShell 中正常運作,但如果檔案包含非 Ascii 字元,則可能會中斷Windows PowerShell。
如果您需要在腳本中使用非 Ascii 字元,請使用 BOM 將它們儲存為 UTF-8。 如果沒有 BOM,Windows PowerShell將腳本誤譯為在舊版 「ANSI」 字碼頁中編碼。 相反地,具有 UTF-8 BOM 的檔案在類似 Unix 的平臺上可能會有問題。 許多 Unix 工具,例如
cat
、
sed
、
awk
和某些編輯器,例如
gedit
不知道如何處理 BOM。
Windows PowerShell中的字元編碼
在 PowerShell 5.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) 。
一般而言,Windows PowerShell預設會使用 Unicode
UTF-16LE
編碼。 不過,Windows PowerShell 中 Cmdlet 所使用的預設編碼方式不一致。
使用除了 以外的任何 Unicode 編碼
UTF7
方式,一律會建立 BOM。
針對將輸出寫入檔案的 Cmdlet:
-
Out-File
和重新導向運算子
>
並
>>
建立 UTF-16LE,這與 和
Add-Content
明顯不同
Set-Content
。
-
New-ModuleManifest
和
Export-CliXml
也會建立 UTF-16LE 檔案。
-
當目標檔案是空的或不存在時,
Set-Content
並使用
Add-Content
Default
編碼。
Default
是使用中系統地區設定的 ANSI 舊版字碼頁所指定的編碼方式。
-
Export-Csv
會
Ascii
建立檔案,但在使用
Append
參數時使用不同的編碼方式 (請參閱下列) 。
-
Export-PSSession
預設會建立具有 BOM 的 UTF-8 檔案。
-
New-Item -Type File -Value
會建立無 BOM 的 UTF-8 檔案。
-
Send-MailMessage
預設會使用
Ascii
編碼。
-
Start-Transcript
使用
Utf8
BOM 建立檔案。 使用
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 (v7.1 和更新版本中) ,
Encoding
參數支援下列值:
-
ascii
:使用 ASCII (7 位) 字元集的編碼方式。
-
bigendianunicode
:使用大位元組位元組順序以 UTF-16 格式編碼。
-
bigendianutf32
:使用大位元組位元組順序以 UTF-32 格式編碼。
-
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
。
從 PowerShell 6.2 開始,
Encoding
參數也允許已註冊字碼頁的數值識別碼, (例如
-Encoding 1251
) 或已註冊字碼頁的字串名稱 (,例如
-Encoding "windows-1251"
) 。 如需詳細資訊,請參閱
Encoding.CodePage 的
.NET 檔。
變更預設編碼
PowerShell 有兩個預設變數,可用來變更預設編碼行為。
-
$PSDefaultParameterValues
-
$OutputEncoding
如需詳細資訊,請參閱
about_Preference_Variables
。
從 PowerShell 5.1 開始,重新導向運算子會 (
>
並
>>
) 呼叫
Out-File
Cmdlet。 因此,您可以使用喜好設定變數來設定預設編碼方式,
$PSDefaultParameterValues
如下列範例所示: