Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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í
-
Asciipoužívá znakovou sadu Ascii (7bitová). -
BigEndianUnicodepoužívá UTF-16 s pořadím velkých bajtů. -
BigEndianUTF32používá UTF-32 s pořadím velkých bajtů. -
Bytezakóduje sadu znaků do posloupnosti bajtů. -
DefaultPoužívá kódování, které odpovídá aktivní znakové stránce systému (obvykle ANSI). -
OemPoužívá kódování, které odpovídá aktuální znakové stránce OEM systému. -
Stringstejné jakoUnicode. -
Unicodepoužívá UTF-16 s minimálním pořadím bajtů. -
Unknownstejné jakoUnicode. -
UTF32používá UTF-32 s minimálním pořadím bajtů. -
UTF7používá UTF-7. -
UTF8použí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-Filea operátory přesměrování>a>>vytvářejí UTF-16LE, což se výrazně liší odSet-ContentaAdd-Content.New-ModuleManifestaExport-Clixmltaké vytvářejí soubory UTF-16LE.Pokud je cílový soubor prázdný nebo neexistuje,
Set-ContentaAdd-Contentpoužívají kódováníDefault.Defaultje kódování určené starší stránkou kódu ANSI aktivního systémového národního prostředí.Export-Csvvytváří souboryAscii, ale při použití parametru Append používá jiné kódování (viz níže).Export-PSSessionve výchozím nastavení vytvoří soubory UTF-8 s BOM.New-Item -Type File -Valuevytvoří soubor UTF-8 bez BOM.Send-MailMessageve výchozím nastavení používá kódováníAscii.Start-Transcriptvytvoří souboryUtf8pomocí 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 -Appenda 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-Contentzjistí 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í ANSIDefault. ChováníAdd-Contentje stejné v PowerShellu (v6 a vyšší), s výjimkou výchozího kódování jeUtf8.Export-Csv -Appendodpoví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 -Appendodpoví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-ContentaImport-PowerShellDataFilepoužívají kódováníDefaultANSI. ANSI je také to, co modul PowerShellu používá při čtení zdrojového kódu ze souborů.Import-Csv,Import-ClixmlaSelect-StringpředpokládajíUtf8v 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ů.