about_Character_Encoding

Korte beschrijving

Hierin wordt beschreven hoe PowerShell tekencodering gebruikt voor invoer en uitvoer van tekenreeksgegevens.

Lange beschrijving

Unicode is een wereldwijde tekencoderingsstandaard. Het systeem maakt uitsluitend gebruik van Unicode voor teken- en tekenreeksmanipulatie. Raadpleeg de Unicode-standaard voor een gedetailleerde beschrijving van alle aspecten van Unicode.

Windows ondersteunt Unicode- en traditionele tekensets. Traditionele tekensets, zoals Windows-codepagina's, gebruiken 8-bits waarden of combinaties van 8-bits waarden om de tekens weer te geven die in een specifieke taal of geografische regio-instellingen worden gebruikt.

PowerShell maakt standaard gebruik van een Unicode-tekenset. Verschillende cmdlets hebben echter een coderingsparameter waarmee codering voor een andere tekenset kan worden opgegeven. Met deze parameter kunt u de specifieke tekens kiezen die u nodig hebt voor interoperabiliteit met andere systemen en toepassingen.

De volgende cmdlets hebben de coderingsparameter:

  • 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

Het bytevolgordeteken

De byte-order-mark (BOM) is een Unicode-handtekening in de eerste paar bytes van een bestand of tekststroom die aangeeft welke Unicode-codering wordt gebruikt voor de gegevens. Zie de byte ordermarkeringsdocumentatie voor meer informatie.

In Windows PowerShell maakt elke Unicode-codering, met uitzondering UTF7van, altijd een stuklijst. PowerShell (v6 en hoger) wordt standaard ingesteld utf8NoBOM voor alle tekstuitvoer.

Vermijd het gebruik van BOM's in UTF-8-bestanden voor de beste algehele compatibiliteit. Unix-platforms en unix-erfgoedhulpprogramma's die ook worden gebruikt op Windows-platforms bieden geen ondersteuning voor BOM's.

Op dezelfde manier UTF7 moet codering worden vermeden. UTF-7 is geen standaard Unicode-codering en wordt zonder stuklijst geschreven in alle versies van PowerShell.

Het maken van PowerShell-scripts op een Unix-achtig platform of het gebruik van een platformoverschrijdende editor in Windows, zoals Visual Studio Code, resulteert in een bestand dat is gecodeerd met behulp van UTF8NoBOM. Deze bestanden werken prima in PowerShell, maar kunnen in Windows PowerShell worden onderbroken als het bestand niet-Ascii-tekens bevat.

Als u niet-Ascii-tekens in uw scripts wilt gebruiken, slaat u deze op als UTF-8 met bom. Zonder de BOM wordt uw script door Windows PowerShell verkeerd geïnterpreteerd als gecodeerd in de verouderde ANSI-codepagina. Omgekeerd kunnen bestanden met de UTF-8 BOM problematisch zijn op Unix-achtige platforms. Veel Unix-hulpprogramma's, zoals cat, seden awksommige editors, zoals gedit niet weten hoe de bom moet worden behandeld.

Tekencodering in Windows PowerShell

In PowerShell 5.1 ondersteunt de coderingsparameter de volgende waarden:

  • Ascii Maakt gebruik van Ascii-tekenset (7-bits).
  • BigEndianUnicode Maakt gebruik van UTF-16 met de bytevolgorde big-endian.
  • BigEndianUTF32 Maakt gebruik van UTF-32 met de big-endian bytevolgorde.
  • Byte Codeert een reeks tekens in een reeks bytes.
  • Default Maakt gebruik van de codering die overeenkomt met de actieve codepagina van het systeem (meestal ANSI).
  • Oem Maakt gebruik van de codering die overeenkomt met de huidige OEM-codepagina van het systeem.
  • String Hetzelfde als Unicode.
  • Unicode Maakt gebruik van UTF-16 met de bytevolgorde little-endian.
  • Unknown Hetzelfde als Unicode.
  • UTF32 Maakt gebruik van UTF-32 met de bytevolgorde little-endian.
  • UTF7 Maakt gebruik van UTF-7.
  • UTF8 Maakt gebruik van UTF-8 (met BOM).

In het algemeen gebruikt Windows PowerShell standaard de Unicode UTF-16LE-codering . De standaardcodering die wordt gebruikt door cmdlets in Windows PowerShell, is echter niet consistent.

Notitie

Als u Unicode-codering gebruikt, met uitzondering UTF7van, wordt altijd een stuklijst gemaakt.

Voor cmdlets die uitvoer naar bestanden schrijven:

  • Out-File en de omleidingsoperatoren > en >> maken UTF-16LE, die met name verschilt van Set-Content en Add-Content.

  • New-ModuleManifest en Export-CliXml maak ook UTF-16LE-bestanden.

  • Wanneer het doelbestand leeg is of niet bestaat en Set-ContentAdd-Content codering gebruikt Default . Default is de codering die is opgegeven door de ansi-codepagina van de actieve systeeminstelling.

  • Export-Csv maakt Ascii bestanden, maar gebruikt andere codering bij het gebruik van de parameter Toevoegen (zie hieronder).

  • Export-PSSession maakt standaard UTF-8-bestanden met BOM.

  • New-Item -Type File -Value maakt een BOM-less UTF-8-bestand.

  • Send-MailMessage maakt standaard gebruik van Ascii codering.

  • Start-Transcript maakt Utf8 bestanden met een BOM. Wanneer de parameter Toevoegen wordt gebruikt, kan de codering verschillen (zie hieronder).

Voor opdrachten die worden toegevoegd aan een bestaand bestand:

  • Out-File -Append en de >> omleidingsoperator probeert niet overeen te komen met de codering van de inhoud van het bestaande doelbestand. In plaats daarvan gebruiken ze de standaardcodering, tenzij de coderingsparameter wordt gebruikt. U moet de oorspronkelijke codering van bestanden gebruiken bij het toevoegen van inhoud.

  • Als er geen expliciete coderingsparameter is, Add-Content detecteert u de bestaande codering en past u deze automatisch toe op de nieuwe inhoud. Als de bestaande inhoud geen bom heeft, Default wordt ANSI-codering gebruikt. Het gedrag van Add-Content is hetzelfde in PowerShell (v6 en hoger), behalve de standaardcodering.Utf8

  • Export-Csv -Append komt overeen met de bestaande codering wanneer het doelbestand een stuklijst bevat. Bij afwezigheid van een bom wordt codering gebruikt Utf8 .

  • Start-Transcript -Append komt overeen met de bestaande codering van bestanden die een stuklijst bevatten. Als er geen bom is, wordt standaard Ascii gecodeerd. Deze codering kan leiden tot gegevensverlies of beschadiging van tekens wanneer de gegevens in het transcript meerderebytetekens bevatten.

Voor cmdlets die tekenreeksgegevens lezen bij afwezigheid van een stuklijst:

  • Get-Content en Import-PowerShellDataFile maakt gebruik van de Default ANSI-codering. ANSI is ook wat de PowerShell-engine gebruikt wanneer de broncode uit bestanden wordt gelezen.

  • Import-Csv, Import-CliXmlen Select-String gaat ervan uit dat Utf8 er geen bom is.

Tekencodering in PowerShell

In PowerShell (v7.1 en hoger) ondersteunt de coderingsparameter de volgende waarden:

  • ascii: gebruikt de codering voor de ASCII-tekenset (7-bits).
  • ansi: Gebruikt de codering voor de ANSI-codepagina van de huidige cultuur. Deze optie is toegevoegd in PowerShell 7.4.
  • bigendianunicode: Codeert in UTF-16-indeling met behulp van de bytevolgorde big-endian.
  • bigendianutf32: Codeert in UTF-32-indeling met behulp van de bytevolgorde big-endian.
  • oem: maakt gebruik van de standaardcodering voor MS-DOS en consoleprogramma's.
  • unicode: Codeert in UTF-16-indeling met behulp van de bytevolgorde little-endian.
  • utf7: Codeert in UTF-7-indeling.
  • utf8: Codeert in UTF-8-indeling (geen BOM).
  • utf8BOM: Codeert in UTF-8-indeling met Byte Order Mark (BOM)
  • utf8NoBOM: Codeert in UTF-8-indeling zonder Byte Order Mark (BOM)
  • utf32: Codeert in UTF-32-indeling met behulp van de bytevolgorde little-endian.

PowerShell is standaard ingesteld utf8NoBOM voor alle uitvoer.

Vanaf PowerShell 6.2 staat de coderingsparameter ook numerieke id's toe van geregistreerde codepagina's (zoals -Encoding 1251) of tekenreeksnamen van geregistreerde codepagina's (zoals-Encoding "windows-1251"). Zie de .NET-documentatie voor Encoding.CodePage voor meer informatie.

Vanaf PowerShell 7.4 kunt u de Ansi waarde voor de coderingsparameter gebruiken om de numerieke id voor de ANSI-codepagina van de huidige cultuur door te geven zonder deze handmatig op te geven.

De standaardcodering wijzigen

PowerShell heeft twee standaardvariabelen die kunnen worden gebruikt om het standaardcoderingsgedrag te wijzigen.

  • $PSDefaultParameterValues
  • $OutputEncoding

Zie about_Preference_Variables voor meer informatie.

Vanaf PowerShell 5.1 roepen de omleidingsoperators (> en >>) de Out-File cmdlet aan. Daarom kunt u de standaardcodering van deze instellen met behulp van de $PSDefaultParameterValues voorkeursvariabele, zoals wordt weergegeven in dit voorbeeld:

$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'

Gebruik de volgende instructie om de standaardcodering te wijzigen voor alle cmdlets met de parameter Encoding .

$PSDefaultParameterValues['*:Encoding'] = 'utf8'

Belangrijk

Als u deze opdracht in uw PowerShell-profiel plaatst, wordt de voorkeur gegeven aan een algemene sessie-instelling die van invloed is op alle opdrachten en scripts die geen expliciete codering opgeven.

Op dezelfde manier moet u dergelijke opdrachten opnemen in uw scripts of modules die u op dezelfde manier wilt gedragen. Met deze opdrachten zorgt u ervoor dat cmdlets zich op dezelfde manier gedragen, zelfs wanneer ze worden uitgevoerd door een andere gebruiker, op een andere computer of in een andere versie van PowerShell.

De automatische variabele $OutputEncoding is van invloed op de codering die PowerShell gebruikt om te communiceren met externe programma's. Het heeft geen effect op de codering die de operators voor uitvoeromleiding en PowerShell-cmdlets gebruiken om op te slaan in bestanden.

Zie ook