Sdílet prostřednictvím


about_Kódování_znaků

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 v tématu Unicode Standard.

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ěkteré rutiny ale mají parametr Kódování, který může určit 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
    • Format-Hex
    • Import-Csv
    • Out-File
    • Select-String
    • Send-MailMessage

Značka pořadí bajtů

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

V prostředí Windows PowerShell vždy jakékoli kódování Unicode, kromě UTF7, vytvoří BOM. PowerShell (verze 6 a vyšší) má ve výchozím nastavení utf8NoBOM pro veškerý textový výstup.

Pro nejlepší celkovou kompatibilitu se vyhněte používání BOM ve souborech UTF-8. Platformy Unix a nástroje z nich odvozené, používané také na platformách Windows, nepodporují BOM.

Podobně byste se měli vyhnout kódování UTF7. UTF-7 není standardní kódování Unicode a zapisuje se bez znaku pořadí bajtů 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 znaky jiné než Ascii, uložte je jako UTF-8 s BOM. Bez BOM 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 nástrojů systému Unix, jako jsou cat, sed, awk, a některé editory, jako je gedit, nevědí, jak zacházet s BOM.

Kódování znaků ve Windows PowerShellu

V PowerShellu 5.1 podporuje parametr kódování 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í, které odpovídá aktivní znakové stránce systému (obvykle ANSI).
  • Oem Používá kódování, které odpovídá 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 BOM).

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

Při použití libovolného kódování Unicode kromě UTF7se vždy vytvoří BOM.

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

  • Out-File a operátory přesměrování > a >> vytvářejí UTF-16LE, což se výrazně liší od Set-Content a Add-Content.

  • New-ModuleManifest a Export-Clixml také vytvářejí soubory UTF-16LE.

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

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

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

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

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

  • Start-Transcript vytvoří soubory Utf8 pomocí kusovníku. 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 nesnaží odpovídat kódování obsahu existujícího cílového souboru. Místo toho používají výchozí kódování, pokud se nepoužívá parametr Encoding. Při připojování obsahu je nutné použít původní kódování souborů.

  • Bez explicitního parametru 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ý BOM, použije se kódování ANSI Default. 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 BOM. V případě neexistence startovacího bajtu používá kódování Utf8.

  • Start-Transcript -Append odpovídá existujícímu kódování souborů, které obsahují BOM. V případě absence BOM se ve výchozím nastavení používá kódování 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.

Pro cmdlety, které čtou řetězcová data v nepřítomnosti BOM:

  • Get-Content a Import-PowerShellDataFile používají kódování Default 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ádají Utf8 v případě absence BOM.

Kódování znaků v PowerShellu

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

  • ascii: Používá kódování znakové sady ASCII (7bitová).
  • ansi: Používá kódování pro aktuální znakovou stránku ANSI 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í pořadí malých bajtů.
  • 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ů.

PowerShell standardně používá utf8NoBOM pro všechny výstupy.

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

Od verze PowerShell 7.4 můžete použít hodnotu ANSI parametru Encoding a předat číselné ID pro znakovou stránku ANSI aktuální kultury, aniž by bylo nutné ji 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 části about_Preference_Variables.

Počínaje PowerShellem 5.1 volají operátory přesměrování (> a >>) cmdlet Out-File. Proto můžete nastavit výchozí kódování pomocí proměnné předvoleb $PSDefaultParameterValues, 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, předvolba se stane globálním nastavením 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é