描述 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 編碼方式。 如需詳細資訊,請參閱 位元組順序標記 檔。

        在 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 如下列範例所示:

        $PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'
        

        使用下列語句來變更所有具有 Encoding 參數的 Cmdlet 的預設 編碼 方式。

        $PSDefaultParameterValues['*:Encoding'] = 'utf8'
        

        將此命令放在 PowerShell 設定檔中,可讓喜好設定成為會影響未明確指定編碼之所有命令和腳本的會話全域設定。

        同樣地,您應該在想要以相同方式運作的腳本或模組中包含這類命令。 使用這些命令可確保 Cmdlet 的運作方式相同,即使其他使用者、在不同的電腦上或不同版本的 PowerShell 上執行也一樣。

        自動變數 $OutputEncoding 會影響 PowerShell 用來與外部程式通訊的編碼方式。 它不會影響輸出重新導向運算子和 PowerShell Cmdlet 用來儲存至檔案的編碼方式。

      • about_Preference_Variables
      • 位元組順序標記
      • 字碼頁 - Win32 應用程式
      • Encoding.CodePage
      • .NET 中的字元編碼簡介
      • Unicode 標準
      • UTF-16LE
  •