about_Character_Encoding

Kurze Beschreibung

Beschreibt, wie PowerShell die Zeichencodierung für die Eingabe und Ausgabe von Zeichenfolgendaten verwendet.

Lange Beschreibung

Unicode ist ein weltweiter Zeichencodierungsstandard. Das System verwendet Unicode ausschließlich für Zeichen- und Zeichenfolgenmanipulation. Eine ausführliche Beschreibung aller Aspekte von Unicode finden Sie im Unicode-Standard.

Windows unterstützt Unicode- und herkömmliche Zeichensätze. Herkömmliche Zeichensätze, z. B. Windows-Codeseiten, verwenden 8-Bit-Werte oder Kombinationen von 8-Bit-Werten, um die Zeichen darzustellen, die in einer bestimmten Sprache oder geografischen Regionseinstellungen verwendet werden.

PowerShell verwendet standardmäßig einen Unicode-Zeichensatz. Mehrere Cmdlets verfügen jedoch über einen Codierungsparameter , der die Codierung für einen anderen Zeichensatz angeben kann. Mit diesem Parameter können Sie die spezifische Zeichencodierung auswählen, die Sie für die Interoperabilität mit anderen Systemen und Anwendungen benötigen.

Die folgenden Cmdlets weisen den Codierungsparameter auf:

  • 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

Das Bytereihenfolgenzeichen

Das Bytereihenfolgenzeichen (BOM) ist eine Unicode-Signatur in den ersten Bytes einer Datei oder eines Textstreams, die angeben, welche Unicode-Codierung für die Daten verwendet wird. Weitere Informationen finden Sie in der Dokumentation zum Byte-Bestellzeichen .

In Windows PowerShell erstellt jede Unicode-Codierung außer UTF7immer eine BOM. PowerShell (v6 und höher) ist standardmäßig für alle Textausgabe aktiviert utf8NoBOM .

Vermeiden Sie aus Gründen der allgemeinen Kompatibilität die Verwendung von BOMs in UTF-8-Dateien. Unix-Plattformen und Unix-Erbe-Dienstprogramme, die auch auf Windows-Plattformen verwendet werden, unterstützen keine BOMs.

Ebenso sollte die UTF7 Codierung vermieden werden. UTF-7 ist keine standardmäßige Unicode-Codierung und wird ohne BOM in allen Versionen von PowerShell geschrieben.

Das Erstellen von PowerShell-Skripts auf einer Unix-ähnlichen Plattform oder die Verwendung eines plattformübergreifenden Editors unter Windows, z. B. Visual Studio Code, führt zu einer dateicodierten Verwendung UTF8NoBOM. Diese Dateien funktionieren in PowerShell einwandfrei, können aber in Windows PowerShell unterbrechen, wenn die Datei Nicht-Ascii-Zeichen enthält.

Wenn Sie Nicht-Ascii-Zeichen in Ihren Skripts verwenden müssen, speichern Sie sie mit BOM als UTF-8. Ohne die BOM interpretiert Windows PowerShell Ihr Skript als codiert in der älteren "ANSI"-Codepage. Umgekehrt können Dateien, die über die UTF-8 BOM verfügen, auf Unix-ähnlichen Plattformen problematisch sein. Viele Unix-Tools wie cat, sed, awk, und einige Editoren wie gedit wissen nicht, wie man die BOM behandeln kann.

Zeichencodierung in Windows PowerShell

In PowerShell 5.1 unterstützt der Encoding-Parameter die folgenden Werte:

  • Ascii Verwendet ascii-Zeichensatz (7-Bit).
  • BigEndianUnicode Verwendet UTF-16 mit der Big-End-Byte-Reihenfolge.
  • BigEndianUTF32 Verwendet UTF-32 mit der Big-End-Byte-Reihenfolge.
  • Byte Codiert eine Reihe von Zeichen in eine Bytesequenz.
  • Default Verwendet die Codierung, die der aktiven Codeseite des Systems (in der Regel ANSI) entspricht.
  • Oem Verwendet die Codierung, die der aktuellen OEM-Codeseite des Systems entspricht.
  • String Identisch mit Unicode.
  • Unicode Verwendet UTF-16 mit der Little-Endian Byte-Reihenfolge.
  • Unknown Identisch mit Unicode.
  • UTF32 Verwendet UTF-32 mit der Little-Endian Byte-Reihenfolge.
  • UTF7 Verwendet UTF-7.
  • UTF8 Verwendet UTF-8 (mit BOM).

Im Allgemeinen verwendet Windows PowerShell standardmäßig die Unicode UTF-16LE-Codierung . Die von Cmdlets in Windows PowerShell verwendete Standardcodierung ist jedoch nicht konsistent.

Hinweis

Mit einer beliebigen Unicode-Codierung, mit Ausnahme UTF7, wird immer eine BOM erstellt.

Für Cmdlets, die ausgabe in Dateien schreiben:

  • Out-File und die Umleitungsoperatoren > und >> erstellen UTF-16LE, die sich insbesondere von Set-Content und Add-Content.

  • New-ModuleManifest und Export-CliXml auch UTF-16LE-Dateien erstellen.

  • Wenn die Zieldatei leer ist oder nicht vorhanden ist, Set-Content und Add-Content verwenden Sie Default die Codierung. Default ist die Codierung, die durch die ANSI-Legacycodeseite des aktiven Systemgebietsschemas angegeben wird.

  • Export-Csv erstellt Ascii Dateien, verwendet jedoch bei Verwendung des Append-Parameters unterschiedliche Codierung (siehe unten).

  • Export-PSSession erstellt UTF-8-Dateien standardmäßig mit BOM.

  • New-Item -Type File -Value erstellt eine BOM-weniger UTF-8-Datei.

  • Send-MailMessage verwendet Ascii standardmäßig Codierung.

  • Start-Transcript erstellt Utf8 Dateien mit einer BOM. Wenn der Append-Parameter verwendet wird, kann die Codierung unterschiedlich sein (siehe unten).

Für Befehle, die an eine vorhandene Datei angefügt werden:

  • Out-File -Append und der >> Umleitungsoperator versucht nicht, mit der Codierung des Inhalts der vorhandenen Zieldatei übereinzugleichen. Stattdessen verwenden sie die Standardcodierung, es sei denn, der Codierungsparameter wird verwendet. Sie müssen beim Anfügen von Inhalten die ursprüngliche Codierung der Dateien verwenden.

  • Wenn kein expliziter Codierungsparameter vorhanden ist, Add-Content wird die vorhandene Codierung erkannt und automatisch auf den neuen Inhalt angewendet. Wenn der vorhandene Inhalt keine BOM aufweist, Default wird die ANSI-Codierung verwendet. Das Verhalten ist Add-Content in PowerShell (v6 und höher) identisch, es sei denn, die Standardcodierung ist Utf8.

  • Export-Csv -Append entspricht der vorhandenen Codierung, wenn die Zieldatei eine BOM enthält. Wenn keine BOM vorhanden ist, wird die Codierung verwendet Utf8 .

  • Start-Transcript -Append entspricht der vorhandenen Codierung von Dateien, die eine BOM enthalten. Wenn keine BOM vorhanden ist, wird Ascii standardmäßig eine Codierung verwendet. Diese Codierung kann zu Datenverlusten oder Zeichenbeschädigungen führen, wenn die Daten im Transkript Multibyte-Zeichen enthalten.

Für Cmdlets, die Zeichenfolgendaten lesen, wenn keine BOM vorhanden ist:

  • Get-Content und Import-PowerShellDataFile verwendet die Default ANSI-Codierung. ANSI verwendet auch das PowerShell-Modul, wenn es Quellcode aus Dateien liest.

  • Import-Csv, Import-CliXmlund Select-String gehen Sie davon aus Utf8 , dass keine BOM vorhanden ist.

Zeichencodierung in PowerShell

In PowerShell (v7.1 und höher) unterstützt der Encoding-Parameter die folgenden Werte:

  • ascii: Verwendet die Codierung für den ASCII-Zeichensatz (7-Bit).
  • bigendianunicode: Codiert im UTF-16-Format mit der Big-End-Byte-Reihenfolge.
  • bigendianutf32: Codiert im UTF-32-Format mithilfe der Big-End-Byte-Reihenfolge.
  • oem: Verwendet die Standardcodierung für MS-DOS- und Konsolenprogramme.
  • unicode: Codiert im UTF-16-Format mithilfe der Little-Endian-Bytereihenfolge.
  • utf7: Codiert im UTF-7-Format.
  • utf8: Codiert im UTF-8-Format (keine BOM).
  • utf8BOM: Codiert im UTF-8-Format mit Bytereihenfolgezeichen (BOM)
  • utf8NoBOM: Codiert im UTF-8-Format ohne Byte Order Mark (BOM)
  • utf32: Codiert im UTF-32-Format mithilfe der Little-Endian-Bytereihenfolge.

PowerShell ist standardmäßig für alle Ausgaben aktiviert utf8NoBOM .

Ab PowerShell 6.2 ermöglicht der Encoding-Parameter auch numerische IDs registrierter Codeseiten (z -Encoding 1251. B. ) oder Zeichenfolgennamen registrierter Codeseiten (z -Encoding "windows-1251". B. ). Weitere Informationen finden Sie in der .NET-Dokumentation für Encoding.CodePage.

Ändern der Standardcodierung

PowerShell verfügt über zwei Standardvariablen, die verwendet werden können, um das Standardcodierungsverhalten zu ändern.

  • $PSDefaultParameterValues
  • $OutputEncoding

Weitere Informationen finden Sie unter about_Preference_Variables.

Ab PowerShell 5.1 rufen die Umleitungsoperatoren (> und >>) das Out-File Cmdlet auf. Aus diesem Grund können Sie die Standardcodierung für sie mithilfe der $PSDefaultParameterValues Einstellungsvariablen festlegen, wie in diesem Beispiel gezeigt:

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

Verwenden Sie die folgende Anweisung, um die Standardcodierung für alle Cmdlets mit dem Encoding-Parameter zu ändern.

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

Wichtig

Wenn Sie diesen Befehl in Ihr PowerShell-Profil einfügen, wird die Einstellung als sitzungsübergreifende Einstellung festgelegt, die sich auf alle Befehle und Skripts auswirkt, die keine Codierung explizit angeben.

Ebenso sollten Sie solche Befehle in Ihre Skripts oder Module aufnehmen, die sie auf die gleiche Weise verhalten möchten. Die Verwendung dieser Befehle stellt sicher, dass sich Cmdlets auch dann, wenn sie von einem anderen Benutzer, auf einem anderen Computer oder in einer anderen Version von PowerShell ausgeführt werden, auf die gleiche Weise verhalten.

Die automatische Variable $OutputEncoding wirkt sich auf die Codierung aus, die PowerShell für die Kommunikation mit externen Programmen verwendet. Es hat keine Auswirkungen auf die Codierung, die die Ausgabeumleitungsoperatoren und PowerShell-Cmdlets zum Speichern in Dateien verwenden.

Weitere Informationen