Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Kort beskrivning
Beskriver hur PowerShell använder teckenkodning för indata och utdata från strängdata.
Lång beskrivning
Unicode är en global teckenkodningsstandard. Systemet använder Unicode uteslutande för tecken- och strängmanipulering. En detaljerad beskrivning av alla aspekter av Unicode finns i Unicode Standard.
Windows stöder Unicode och traditionella teckenuppsättningar. Traditionella teckenuppsättningar, till exempel Windows-kodsidor, använder 8-bitarsvärden eller kombinationer av 8-bitarsvärden för att representera de tecken som används i ett visst språk eller i en specifik region.
PowerShell använder en Unicode-teckenuppsättning som standard. Flera cmdlets har dock kodningsparametern som kan specificera kodning för en annan teckenuppsättning. Med den här parametern kan du välja den specifika teckenkodning som du behöver för samverkan med andra system och program.
Följande cmdletar har parametern Kodning:
- 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
Byte-order-mark
Byte-order-mark (BOM) är en Unicode-signatur i de första byten av en fil eller textström som anger vilken Unicode-kodning som används för datan. Mer information finns i dokumentationen byteordningsmarkering.
I Windows PowerShell skapar alla Unicode-kodningar, förutom UTF7, alltid en strukturlista. PowerShell (v6 och senare) använder som standard utf8NoBOM för all textutdata.
För bästa övergripande kompatibilitet bör du undvika att använda BOMs i UTF-8-filer. Unix-plattformar och Unix-heritage-verktyg som också används på Windows-plattformar stöder inte BPM.
På samma sätt bör UTF7 kodning undvikas. UTF-7 är inte en unicode-standardkodning och skrivs utan bom i alla versioner av PowerShell.
Att skapa PowerShell-skript på en Unix-liknande plattform eller använda en plattformsoberoende redigerare i Windows, till exempel Visual Studio Code, resulterar i en fil som kodas med hjälp av UTF8NoBOM. Dessa filer fungerar bra i PowerShell, men kan brytas i Windows PowerShell om filen innehåller icke-Ascii-tecken.
Om du behöver använda icke-Ascii-tecken i skripten sparar du dem som UTF-8 med BOM. Utan BOM tolkar Windows PowerShell felaktigt ditt skript som kodat med den gamla "ANSI"-teckenuppsättningen. Omvänt kan filer som har UTF-8 BOM vara problematiska på Unix-liknande plattformar. Många Unix-verktyg som cat, sedoch awk, och vissa redigerare som till exempel gedit, vet inte hur BOM ska behandlas.
Teckenkodning i Windows PowerShell
I PowerShell 5.1 stöder parametern Kodning följande värden:
-
AsciiAnvänder Ascii-teckenuppsättning (7-bitars). -
BigEndianUnicodeanvänder UTF-16 med den stora byteordningen. -
BigEndianUTF32använder UTF-32 med den stora byteordningen. -
Bytekodar en uppsättning tecken till en sekvens med byte. -
DefaultAnvänder kodningen som motsvarar systemets aktiva kodsida (vanligtvis ANSI). -
OemAnvänder kodningen som motsvarar systemets aktuella OEM-kodsida. -
StringSamma somUnicode. -
UnicodeAnvänder UTF-16 med byteordningen "little-endian". -
UnknownSamma somUnicode. -
UTF32använder UTF-32 med lite endiansk byteordning. -
UTF7använder UTF-7. -
UTF8använder UTF-8 (med BOM).
I allmänhet använder Windows PowerShell Unicode UTF-16LE- kodning som standard. Standardkodningen som används av cmdletar i Windows PowerShell är dock inte konsekvent.
Obs
Om du använder unicode-kodning, förutom UTF7, skapas alltid en bom.
För cmdletar som skriver utdata till filer:
Out-Fileoch omdirigeringsoperatorerna>och>>skapar UTF-16LE, som skiljer sig frånSet-ContentochAdd-Content.New-ModuleManifestochExport-Clixmlskapar också UTF-16LE-filer.När målfilen är tom eller inte finns,
Set-ContentochAdd-ContentanvänderDefault-kodning.Defaultär den kodning som anges av det aktiva systemspråkets ANSI-äldre kodsida.Export-CsvskaparAsciifiler men använder olika kodning när du använder parametern Lägg till (se nedan).Export-PSSessionskapar UTF-8-filer med BOM som standard.New-Item -Type File -Valueskapar en UTF-8-fil utan BOM.Send-MailMessageanvänderAsciikodning som standard.Start-TranscriptskaparUtf8filer med en strukturlista. När parametern Lägg till används kan kodningen vara annorlunda (se nedan).
För kommandon som lägger till i en befintlig fil:
Out-File -Appendoch>>omdirigeringsoperatorn gör inga försök att matcha kodningen av den befintliga målfilens innehåll. I stället använder de standardkodningen såvida inte parametern Kodning används. Du måste använda filernas ursprungliga kodning när du lägger till innehåll.I avsaknad av en explicit kodning parameter identifierar
Add-Contentden befintliga kodningen och tillämpar den automatiskt på det nya innehållet. Om det befintliga innehållet inte har någon BOM användsDefaultANSI-kodning. Beteendet förAdd-Contentär detsamma i PowerShell (v6 och senare) förutom att standardkodningen ärUtf8.Export-Csv -Appendmatchar den befintliga kodningen när målfilen innehåller en bom. I avsaknad av en BOM använder denUtf8teckenkodning.Start-Transcript -Appendöverensstämmer med den befintliga kodningen av filer som inkluderar en BOM. Om det saknas en BOM, användsAscii-kodning som standard. Den här kodningen kan leda till dataförlust eller teckenskada när data i avskriften innehåller flerabytestecken.
För cmdlets som läser strängdata i avsaknad av ett byteordningsmärke (BOM):
Get-ContentochImport-PowerShellDataFileanvänderDefaultANSI-kodning. ANSI är också vad PowerShell-motorn använder när den läser källkod från filer.Import-Csv,Import-ClixmlochSelect-StringförutsätterUtf8i avsaknad av en byteordningsmarkering.
Teckenkodning i PowerShell
I PowerShell (v7.1 och senare) stöder parametern Kodning följande värden:
-
ascii: Använder kodningen för ASCII-teckenuppsättningen (7-bitars). -
ansi: Använder kodningen för den aktuella kulturens ANSI-kodsida. Det här alternativet lades till i PowerShell 7.4. -
bigendianunicode: Kodar i UTF-16-format med hjälp av storslutsbyteordningen. -
bigendianutf32: Kodar i UTF-32-format med hjälp av storslutsbyteordningen. -
oem: Använder standardkodning för MS-DOS- och konsolprogram. -
unicode: Kodar i UTF-16-format med hjälp av lite endiansk byteordning. -
utf7: Kodar i UTF-7-format. -
utf8: Kodar i UTF-8-format (ingen BOM). -
utf8BOM: Kodar i UTF-8-format med Byte Order Mark (BOM) -
utf8NoBOM: Kodar i UTF-8-format utan Byte Order Mark (BOM) -
utf32: Kodar i UTF-32-format med hjälp av lite endiansk byteordning.
Som standardinställning används utf8NoBOM i PowerShell för all utdata.
Från och med PowerShell 6.2 tillåter parametern Kodning även numeriska ID:n för registrerade kodsidor (till exempel -Encoding 1251) eller strängnamn för registrerade kodsidor (till exempel -Encoding "windows-1251"). Mer information finns i .NET-dokumentationen för Encoding.CodePage.
Från och med PowerShell 7.4 kan du använda värdet ANSI för parametern Kodning för att skicka det numeriska ID:t för den aktuella kulturens ANSI-kodsida utan att behöva ange det manuellt.
Ändra standardkodning
PowerShell har två standardvariabler som kan användas för att ändra standardkodningsbeteendet.
$PSDefaultParameterValues$OutputEncoding
Mer information finns i about_Preference_Variables.
Från och med PowerShell 5.1 anropar omdirigeringsoperatorerna (> och >>) cmdleten Out-File. Därför kan du ange standardkodning av dem med hjälp av $PSDefaultParameterValues inställningsvariabel som visas i det här exemplet:
$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'
Använd följande instruktion för att ändra standardkodningen för alla cmdletar som har parametern Kodning.
$PSDefaultParameterValues['*:Encoding'] = 'utf8'
Viktig
Om du placerar det här kommandot i din PowerShell-profil blir inställningen sessions-global och påverkar alla kommandon och skript som inte uttryckligen har angivits en kodning.
På samma sätt bör du inkludera sådana kommandon i dina skript eller moduler som du vill bete dig på samma sätt. Med hjälp av dessa kommandon ser du till att cmdletar fungerar på samma sätt även när de körs av en annan användare, på en annan dator eller i en annan version av PowerShell.
Den automatiska variabeln $OutputEncoding påverkar den kodning som PowerShell använder för att kommunicera med externa program. Det påverkar inte kodningen som utdataomdirigeringsoperatorerna och PowerShell-cmdletarna använder för att spara till filer.