about_Character_Encoding

Krátký popis

Popisuje, jak PowerShell používá kódování znaků pro vstup a výstup řetězcových dat.

Dlouhý popis

Unicode je celosvětová standard kódování znaků. Systém používá unicode výhradně pro manipulaci s znaky a řetězci. Podrobný popis všech aspektů unicode najdete ve standardu Unicode.

Windows podporuje Unicode a tradiční znakové sady. Tradiční znakové sady, například znakové stránky Systému Windows, používají 8bitové hodnoty nebo kombinace 8bitových hodnot k reprezentaci znaků používaných v konkrétním jazyce nebo zeměpisné oblasti.

PowerShell ve výchozím nastavení používá znakovou sadu Unicode. Několik rutin má však parametr Kódování , který může určovat kódování pro jinou znakovou sadu. Tento parametr umožňuje zvolit konkrétní kódování znaků, které potřebujete pro interoperabilitu s jinými systémy a aplikacemi.

Následující rutiny mají parametr Kódování :

  • Microsoft.PowerShell.Management
    • Add-Content
    • Get-Content
    • Set-Content
  • Microsoft.PowerShell.Utility
    • Export-Clixml
    • Export-Csv
    • Export-PSSession
    • Rutina Format-Hex
    • Import-Csv
    • Out-File
    • Select-String
    • Send-MailMessage

Značka pořadí bajtů

Znak bajtů (BOM) je podpis Unicode v několika prvních bajtech souboru nebo textového datového proudu, který označuje kódování Unicode používané pro data. Další informace najdete v dokumentaci k značkě pořadí bajtů.

V prostředí Windows PowerShell vytvoří jakékoli kódování Unicode s výjimkou UTF7vždy kusovníku. Výchozí nastavení utf8NoBOM PowerShellu (v6 a vyšší) pro veškerý textový výstup.

Nejlepší celkovou kompatibilitu dosáhnete, abyste v souborech UTF-8 nepoužívat kusovníky. Platformy Unix a nástroje kulturního dědictví systému Unix používané také na platformách Windows nepodporují kusovníky.

UTF7 Podobně by se mělo kódování vyhnout. UTF-7 není standardní kódování Unicode a zapisuje se bez kusovníku ve všech verzích PowerShellu.

Vytváření skriptů PowerShellu na platformě podobné systému Unix nebo použití editoru pro různé platformy ve Windows, jako je například Visual Studio Code, vede k zakódování souboru pomocí UTF8NoBOM. Tyto soubory fungují v PowerShellu správně, ale pokud soubor obsahuje jiné znaky než Ascii, může se ve Windows PowerShellu přerušit.

Pokud potřebujete ve skriptech používat jiné znaky než Ascii, uložte je jako UTF-8 s kusovníkem. Bez kusovníku windows PowerShell nesprávně interpretuje váš skript jako kódovaný ve starší kódové stránce ANSI. Naopak soubory, které mají UTF-8 BOM mohou být problematické na platformách unixových. Mnoho unixových nástrojů, jako catje , sed, awka některé editory, jako gedit například nevím, jak zacházet s kusovníkem.

Kódování znaků ve Windows PowerShellu

V PowerShellu 5.1 podporuje parametr Encoding následující hodnoty:

  • Ascii Používá znakovou sadu Ascii (7bitová).
  • BigEndianUnicode Používá UTF-16 s pořadím velkých bajtů.
  • BigEndianUTF32 Používá UTF-32 s pořadím velkých bajtů.
  • Byte Zakóduje sadu znaků do posloupnosti bajtů.
  • Default Používá kódování odpovídající aktivní znakové stránce systému (obvykle ANSI).
  • Oem Používá kódování odpovídající aktuální znakové stránce OEM systému.
  • String Stejné jako Unicode.
  • Unicode Používá UTF-16 s minimálním pořadím bajtů.
  • Unknown Stejné jako Unicode.
  • UTF32 Používá UTF-32 s minimálním pořadím bajtů.
  • UTF7 Používá UTF-7.
  • UTF8 Používá UTF-8 (s kusovníkem).

Obecně platí, že Windows PowerShell ve výchozím nastavení používá kódování Unicode UTF-16LE . Výchozí kódování používané rutinami v prostředí Windows PowerShell však není konzistentní.

Poznámka:

Pomocí libovolného kódování Unicode s výjimkou UTF7vždy vytvoří kusovník.

Rutiny, které zapisují výstup do souborů:

  • Out-File a operátory > přesměrování a >> vytvářejí UTF-16LE, které se zejména liší od Set-Content a Add-Content.

  • New-ModuleManifest a Export-CliXml také vytvářet soubory UTF-16LE.

  • Pokud je cílový soubor prázdný nebo neexistuje, Set-Content a Add-Content použijte Default kódování. Default je kódování určené znakovou stránkou ANSI aktivního národního prostředí systému.

  • Export-Csvvytváří Ascii soubory, ale při použití parametru Append používá jiné kódování (viz níže).

  • Export-PSSession vytvoří soubory UTF-8 s BOM ve výchozím nastavení.

  • New-Item -Type File -Value vytvoří soubor UTF-8 bez BOM.

  • Send-MailMessage ve výchozím nastavení používá Ascii kódování.

  • Start-Transcript vytvoří Utf8 soubory s kusovníkem. Při použití parametru Append se kódování může lišit (viz níže).

Příkazy, které se připojí k existujícímu souboru:

  • Out-File -Append>> a operátor přesměrování se nepokoušá o shodu s kódováním obsahu existujícího cílového souboru. Místo toho používají výchozí kódování, pokud není použit parametr Kódování . Při připojování obsahu je nutné použít původní kódování souborů.

  • Pokud chybí explicitní parametr kódování , Add-Content zjistí stávající kódování a automaticky ho použije na nový obsah. Pokud existující obsah neobsahuje žádný kusovník, Default použije se kódování ANSI. Chování Add-Content je stejné v PowerShellu (v6 a vyšší), s výjimkou výchozího kódování je Utf8.

  • Export-Csv -Append odpovídá existujícímu kódování, pokud cílový soubor obsahuje kusovník. V případě absence kusovníku se používá Utf8 kódování.

  • Start-Transcript -Append odpovídá existujícímu kódování souborů, které obsahují kusovník. V případě absence kusovníku se ve výchozím nastavení zakóduje Ascii . Toto kódování může vést ke ztrátě dat nebo poškození znaků, pokud data v přepisu obsahují vícebajtové znaky.

Rutiny, které čtou řetězcová data bez kusovníku:

  • Get-Content a Import-PowerShellDataFile používá Default kódování ANSI. ANSI je také to, co modul PowerShellu používá při čtení zdrojového kódu ze souborů.

  • Import-Csv, Import-CliXmla Select-String předpokládejme Utf8 v nepřítomnosti kusovníku.

Kódování znaků v PowerShellu

V PowerShellu (verze 7.1 a vyšší) parametr Encoding podporuje následující hodnoty:

  • ascii: Používá kódování znakové sady ASCII (7bitová).
  • ansi: Používá kódování pro kódovou stránku ANSI aktuální jazykové verze. Tato možnost byla přidána v PowerShellu 7.4.
  • bigendianunicode: Kóduje ve formátu UTF-16 pomocí pořadí velkých bajtů.
  • bigendianutf32: Kóduje ve formátu UTF-32 pomocí pořadí velkých bajtů.
  • oem: Používá výchozí kódování pro MS-DOS a konzolové programy.
  • unicode: Kóduje ve formátu UTF-16 pomocí malého bajtového pořadí.
  • utf7: Kóduje ve formátu UTF-7.
  • utf8: Kóduje ve formátu UTF-8 (bez BOM).
  • utf8BOM: Kódování ve formátu UTF-8 pomocí značky pořadí bajtů (BOM)
  • utf8NoBOM: Kódování ve formátu UTF-8 bez značky pořadí bajtů (BOM)
  • utf32: Kóduje ve formátu UTF-32 pomocí pořadí malých bajtů.

Výchozí nastavení PowerShellu pro všechny výstupy utf8NoBOM

Počínaje PowerShellem 6.2 umožňuje parametr Kódování také číselná ID registrovaných znakových stránek (jako -Encoding 1251) nebo názvy řetězců registrovaných znakových stránek (například -Encoding "windows-1251"). Další informace najdete v dokumentaci k .NET pro Encoding.CodePage.

Počínaje PowerShellem 7.4 můžete hodnotu parametru Encoding použít Ansi k předání číselného ID pro znakovou stránku ANSI aktuální jazykové verze, aniž byste ji museli zadávat ručně.

Změna výchozího kódování

PowerShell má dvě výchozí proměnné, které je možné použít ke změně výchozího chování kódování.

  • $PSDefaultParameterValues
  • $OutputEncoding

Další informace najdete v tématu about_Preference_Variables.

Počínaje PowerShellem 5.1 volají operátory přesměrování (> a >>) rutinu Out-File . Proto můžete nastavit výchozí kódování pomocí $PSDefaultParameterValues proměnné předvoleb, jak je znázorněno v tomto příkladu:

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

Pomocí následujícího příkazu můžete změnit výchozí kódování pro všechny rutiny, které mají parametr Encoding .

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

Důležité

Když tento příkaz vložíte do profilu PowerShellu, nastaví se předvolba globálního nastavení relace, které ovlivní všechny příkazy a skripty, které explicitně nezadávají kódování.

Podobně byste tyto příkazy měli zahrnout do skriptů nebo modulů, které chcete chovat stejným způsobem. Použití těchto příkazů zajistí, že se rutiny chovají stejně, i když je spouští jiný uživatel, na jiném počítači nebo v jiné verzi PowerShellu.

Automatická proměnná $OutputEncoding ovlivňuje kódování, které PowerShell používá ke komunikaci s externími programy. Nemá žádný vliv na kódování, které operátory přesměrování výstupu a rutiny PowerShellu používají k ukládání do souborů.

Viz také