Dela via


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 världsomspännande 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 geografiska regioninställningar.

PowerShell använder ett Unicode-tecken som angetts 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

BOM (byte-order-mark) ä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 bytebeställningsmärke .

I Windows PowerShell skapar alla Unicode-kodningar, förutom UTF7, alltid en BOM. PowerShell (v6 och senare) används utf8NoBOM som standard för alla textutdata.

För bästa övergripande kompatibilitet bör du undvika att använda snabbmeddelanden 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 tolkar Windows PowerShell skriptet som kodat på den äldre "ANSI"-kodsidan. Däremot kan filer som har BOM-strukturen UTF-8 vara problematiska på Unix-liknande plattformar. Många Unix-verktyg som cat, sed, awkoch vissa redigerare, till exempel gedit vet inte hur bommen ska behandlas.

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 den stora byteordningen.
  • BigEndianUTF32 Använder UTF-32 med den stora byteordningen.
  • Byte Kodar en uppsättning tecken till 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 som Unicode.
  • Unicode Använder UTF-16 med den lilla byteordningen.
  • Unknown Samma som Unicode.
  • UTF32 Använder UTF-32 med den lilla byteordningen.
  • 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.

Anteckning

Med valfri Unicode-kodning, förutom UTF7, skapas alltid en bom.

För cmdletar som skriver utdata till filer:

  • Out-File och omdirigeringsoperatorerna > och >> skapar UTF-16LE, som i synnerhet skiljer sig från Set-Content och Add-Content.

  • New-ModuleManifest och Export-CliXml skapa även UTF-16LE-filer.

  • När målfilen är tom eller inte finns Set-Content och Add-Content använder Default kodning. Default är den kodning som anges av det aktiva systemspråkets ansi äldre kodsida.

  • Export-Csv skapar Ascii filer men använder annan kodning när du använder tilläggsparametern (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änder Ascii kodning som standard.

  • Start-Transcript skapar Utf8 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.

  • Om det inte finns någon explicit kodningsparameterAdd-Content identifierar den befintliga kodningen och tillämpar den automatiskt på det nya innehållet. Om det befintliga innehållet inte har någon BOM Default används ANSI-kodning. Beteendet Add-Content för är detsamma i PowerShell (v6 och senare) förutom att standardkodningen är Utf8.

  • Export-Csv -Append matchar den befintliga kodningen när målfilen innehåller en bom. I avsaknad av en bom används Utf8 kodning.

  • Start-Transcript -Append matchar den befintliga kodningen av filer som innehåller en strukturlista. Om det inte finns någon strukturlista kodas Ascii den som standard. Den här kodningen kan leda till dataförlust eller teckenskada när data i avskriften innehåller flerabyte tecken.

För cmdletar som läser strängdata i avsaknad av en bom:

  • Get-Content och Import-PowerShellDataFile använder Default ANSI-kodningen. ANSI är också vad PowerShell-motorn använder när den läser källkod från filer.

  • Import-Csv, Import-CliXmloch Select-String förutsätter Utf8 att det inte finns någon 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).
  • bigendianunicode: Kodar i UTF-16-format med hjälp av den stora byteordningen.
  • bigendianutf32: Kodar i UTF-32-format med hjälp av den stora byteordningen.
  • oem: Använder standardkodning för MS-DOS och konsolprogram.
  • unicode: Kodar i UTF-16-format med den little-endianska byteordningen.
  • utf7: Kodar i UTF-7-format.
  • utf8: Kodar i UTF-8-format (ingen BOM).
  • utf8BOM: Kodar i UTF-8-format med BOM (Byte Order Mark)
  • utf8NoBOM: Kodar i UTF-8-format utan bom (Byte Order Mark)
  • utf32: Kodar i UTF-32-format med den little-endianska byteordningen.

PowerShell är standardvärdet utf8NoBOM för 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.

Ä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 för 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 Din PowerShell-profil 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 de här kommandona 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 den kodning som utdataomdirigeringsoperatorerna och PowerShell-cmdletarna använder för att spara till filer.

Se även