about_Character_Encoding
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 cmdletar har dock en kodningsparameter som kan ange 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 kodningsparametern :
- 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 byteen av en fil eller textström som anger vilken Unicode-kodning som används för data. Mer information finns i dokumentationen om byteordermarkering .
I Windows PowerShell skapar alla Unicode-kodningar, förutom UTF7
, alltid en bom. PowerShell (v6 och senare) är standardvärdet utf8NoBOM
för alla textutdata.
För bästa övergripande kompatibilitet bör du undvika att använda virtuella datorer i UTF-8-filer. Unix-plattformar och Unix-heritage-verktyg som också används på Windows-plattformar stöder inte BPM.
UTF7
På samma sätt bör 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 .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 bommen feltolkar Windows PowerShell skriptet som kodat på den äldre "ANSI"-kodsidan. Omvänt kan filer som har UTF-8 BOM vara problematiska på Unix-liknande plattformar. Många Unix-verktyg som cat
, sed
, awk
och vissa redigerare, till exempel gedit
vet inte hur du hanterar bommen.
Teckenkodning i Windows PowerShell
I PowerShell 5.1 stöder kodningsparametern följande värden:
-
Ascii
Använder Ascii(7-bitars) teckenuppsättning. -
BigEndianUnicode
Använder UTF-16 med storslutsbyteordningen. -
BigEndianUTF32
Använder UTF-32 med storslutsbyteordningen. -
Byte
Kodar en uppsättning tecken i en sekvens med byte. -
Default
Använder den kodning som motsvarar systemets aktiva kodsida (vanligtvis ANSI). -
Oem
Använder den kodning som motsvarar systemets aktuella OEM-kodsida. -
String
Samma somUnicode
. -
Unicode
Använder UTF-16 med den lilla slutpunktsbyteordningen. -
Unknown
Samma somUnicode
. -
UTF32
Använder UTF-32 med den lilla slutpunktsbyteordningen. -
UTF7
Använder UTF-7. -
UTF8
Anvä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.
Kommentar
Med valfri Unicode-kodning, förutom UTF7
, skapas alltid en bom.
För cmdletar som skriver utdata till filer:
Out-File
och omdirigeringsoperatorerna>
och>>
skapa UTF-16LE, som skiljer sigSet-Content
från ochAdd-Content
.New-ModuleManifest
ochExport-Clixml
skapa även UTF-16LE-filer.När målfilen är tom eller inte finns
Set-Content
ochAdd-Content
använderDefault
kodning.Default
är den kodning som anges av det aktiva systemspråkets ANSI-äldre kodsida.Export-Csv
skaparAscii
filer men använder olika kodning när du använder parametern Lägg till (se nedan).Export-PSSession
skapar UTF-8-filer med BOM som standard.New-Item -Type File -Value
skapar en BOM-mindre UTF-8-fil.Send-MailMessage
använderAscii
kodning som standard.Start-Transcript
skaparUtf8
filer 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 -Append
>>
och omdirigeringsoperatorn gör inga försök att matcha kodningen av den befintliga målfilens innehåll. I stället använder de standardkodningen om inte kodningsparametern används. Du måste använda filernas ursprungliga kodning när du lägger till innehåll.I avsaknad av en explicit kodningsparameter
Add-Content
identifierar den befintliga kodningen och tillämpar den automatiskt på det nya innehållet. Om det befintliga innehållet inte har någon strukturlistaDefault
används ANSI-kodning. BeteendetAdd-Content
för är detsamma i PowerShell (v6 och senare) förutom att standardkodningen ärUtf8
.Export-Csv -Append
matchar den befintliga kodningen när målfilen innehåller en bom. I avsaknad av en strukturlista använderUtf8
den kodning.Start-Transcript -Append
matchar den befintliga kodningen av filer som innehåller en strukturlista. I avsaknad av en strukturlista är kodningen standardAscii
. Den här kodningen kan leda till dataförlust eller teckenskada när data i avskriften innehåller flerabytestecken.
För cmdletar som läser strängdata i avsaknad av en strukturlista:
Get-Content
ochImport-PowerShellDataFile
använderDefault
ANSI-kodningen. ANSI är också vad PowerShell-motorn använder när den läser källkod från filer.Import-Csv
,Import-Clixml
ochSelect-String
förutsätterUtf8
i avsaknad av en strukturlista.
Teckenkodning i PowerShell
I PowerShell (v7.1 och senare) stöder kodningsparametern följande värden:
-
ascii
: Använder kodningen för ASCII-teckenuppsättningen (7-bitars). -
ansi
: Använder kodningen för 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 den stora byteordningen. -
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 den lite endianska byteordningen. -
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 den lite endianska byteordningen.
PowerShell är som standard för utf8NoBOM
alla utdata.
Från och med PowerShell 6.2 tillåter kodningsparametern ä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 ANSI
värdet för kodningsparametern 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 $PSDefaultParameterValues
av inställningsvariabeln enligt följande exempel:
$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'
Använd följande instruktion för att ändra standardkodningen för alla cmdletar som har kodningsparametern .
$PSDefaultParameterValues['*:Encoding'] = 'utf8'
Viktigt!
Om du placerar det här kommandot i PowerShell-profilen blir inställningen sessions-global som påverkar alla kommandon och skript som inte uttryckligen anger 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.