Delen via


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-standaardvoor 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 encoding- parameter 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 Encoding-parameter:

  • 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 aangeven welke Unicode-codering wordt gebruikt voor de gegevens. Zie de Byte-ordermarkering documentatie voor meer informatie.

In Windows PowerShell maakt elke Unicode-codering, met uitzondering van UTF7, altijd een bytevolgordemarkering aan. PowerShell (v6 en hoger) wordt standaard ingesteld op 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 moet UTF7 codering worden vermeden. UTF-7 is geen standaard Unicode-codering en wordt zonder BOM geschreven in alle PowerShell-versies.

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, sed, awken sommige editors, zoals gedit, weten niet 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 gebruikt 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 gebruikt de codering die overeenkomt met de actieve codepagina van het systeem (meestal ANSI).
  • Oem gebruikt de codering die overeenkomt met de huidige OEM-codepagina van het systeem.
  • String Hetzelfde als Unicode.
  • Unicode gebruikt UTF-16 met de bytevolgorde little-endian.
  • Unknown Hetzelfde als Unicode.
  • UTF32 gebruikt UTF-32 met de bytevolgorde little-endian.
  • UTF7 maakt gebruik van UTF-7.
  • UTF8 gebruikt 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

Wanneer u een Unicode-codering gebruikt, met uitzondering van UTF7, wordt altijd een BOM aangemaakt.

Voor cmdlets die uitvoer naar bestanden wegschrijven:

  • Out-File en de omleidingsoperators > en >> creëren UTF-16LE, wat met name verschilt van Set-Content en Add-Content.

  • New-ModuleManifest en Export-Clixml ook UTF-16LE-bestanden maken.

  • Wanneer het doelbestand leeg is of niet bestaat, Set-Content en Add-ContentDefault codering gebruiken. Default is de encodering die is opgegeven door de ANSI-legacycodepagina van de actieve systeemlocale.

  • Export-Csv maakt Ascii bestanden, maar gebruikt verschillende codering bij het gebruik van 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 Byte Order Mark. 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 proberen 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, detecteert Add-Content de bestaande codering en past deze automatisch toe op de nieuwe inhoud. Als de bestaande inhoud geen bom bevat, wordt Default ANSI-codering gebruikt. Het gedrag van Add-Content is hetzelfde in PowerShell (v6 en hoger), behalve de standaardcodering is Utf8.

  • Export-Csv -Append komt overeen met de bestaande codering wanneer het doelbestand een Byte Order Mark bevat. Bij afwezigheid van een BOM wordt de Utf8-codering gebruikt.

  • Start-Transcript -Append komt overeen met de bestaande codering van bestanden die een BOM bevatten. Bij afwezigheid van een BOM wordt er standaard Ascii-codering gebruikt. Deze codering kan leiden tot gegevensverlies of beschadiging van tekens wanneer de gegevens in het transcript meerderebytetekens bevatten.

Voor cmdlets die tekenreeksgegevens lezen zonder een Byte Order Mark (BOM):

  • 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 ervan uitgaan dat Utf8 niet aanwezig is.

Tekencodering in PowerShell

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

  • ascii: maakt gebruik van 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: Encodeert in UTF-16-indeling met de little-endian-bytevolgorde.
  • 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 gebruikt standaard de waarde utf8NoBOM voor alle uitvoer.

Vanaf PowerShell 6.2 staat de parameter Coderings- 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.CodePagevoor 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_Variablesvoor 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 Codering.

$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, zodat deze op dezelfde manier functioneren. 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 beïnvloedt 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