Freigeben über


about_Character_Encoding

Kurzbeschreibung

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 unter 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 Encoding Parameter, 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 parameter Encoding 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 Textdatenstroms, die angeben, welche Unicode-Codierung für die Daten verwendet wird. Weitere Informationen finden Sie in der Dokumentation zur Byte-Reihenfolgemarke .

In Windows PowerShell erstellt jede Unicode-Codierung mit Ausnahme von UTF7immer eine BOM. PowerShell (v6 und höher) verwendet standardmäßig utf8NoBOM für alle Textausgaben.

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 Datei, die mit UTF8NoBOMcodiert wird. 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 fälschlicherweise als in der veralteten „ANSI“-Codepage kodiert. 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 die BOM behandelt wird.

Zeichencodierung in Windows PowerShell

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

  • Ascii Verwendet ascii-Zeichensatz (7-Bit).
  • BigEndianUnicode Verwendet UTF-16 mit der Big-Endian-Bytereihenfolge.
  • BigEndianUTF32 verwendet UTF-32 mit der Big-Endian-Bytereihenfolge.
  • Byte Codiert eine Reihe von Zeichen in eine Bytesequenz.
  • Default Verwendet die Codierung, die der aktiven Codepage des Systems entspricht (in der Regel ANSI).
  • 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.

Anmerkung

Die Verwendung einer beliebigen Unicode-Kodierung, außer UTF7, erstellt immer ein BOM.

Für Cmdlets, die die Ausgabe in Dateien schreiben:

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

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

  • Wenn die Zieldatei leer ist oder nicht vorhanden ist, verwenden Set-Content und Add-Content die Default-Codierung. Default ist die Kodierung, die durch die veraltete ANSI Code-Seite des aktiven Systemgebietsschemas festgelegt ist.

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

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

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

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

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

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

  • Der Umleitungsoperator Out-File -Append und >> versuchen nicht, die Codierung des Inhalts der bestehenden Zieldatei anzupassen. Stattdessen verwenden sie die Standardcodierung, es sei denn, der Encoding Parameter wird verwendet. Sie müssen beim Anfügen von Inhalten die ursprüngliche Codierung der Dateien verwenden.

  • Wenn kein expliziter Encoding Parameter vorhanden ist, erkennt Add-Content die vorhandene Codierung und wendet sie automatisch auf den neuen Inhalt an. Wenn der vorhandene Inhalt keine BOM aufweist, wird Default ANSI-Codierung verwendet. Das Verhalten von Add-Content ist in PowerShell (v6 und höher) identisch, mit der Ausnahme, dass die Standardcodierung Utf8ist.

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

  • Start-Transcript -Append entspricht der vorhandenen Codierung von Dateien, die eine BOM enthalten. Wenn keine BOM vorhanden ist, wird standardmäßig Ascii 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 wird auch von der PowerShell-Engine verwendet, wenn sie Quellcode aus Dateien liest.

  • Import-Csv, Import-Clixml und Select-String nehmen Utf8 an, wenn 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).
  • ansi: Verwendet die Kodierung für die ANSI-Codepage der aktuellen Kultur. Diese Option wurde in PowerShell 7.4 hinzugefügt.
  • bigendianunicode: Codiert im UTF-16-Format mithilfe der Big-Endian-Byte-Reihenfolge.
  • bigendianutf32: Codiert im UTF-32-Format unter Verwendung der Big-Endian-Byte-Reihenfolge.
  • oem: Verwendet die Standardcodierung für MS-DOS- und Konsolenprogramme.
  • unicode: Codiert im UTF-16-Format in 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 Byte Order Mark (BOM)
  • utf8NoBOM: Codiert im UTF-8-Format ohne Byte Order Mark (BOM)
  • utf32: Kodiert im UTF-32-Format mit der Little-Endian-Bytereihenfolge.

PowerShell verwendet standardmäßig utf8NoBOM für alle Ausgabeformate.

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

Ab PowerShell 7.4 können Sie den ANSI Wert für den parameter Encoding verwenden, um die numerische ID für die ANSI-Codeseite der aktuellen Kultur zu übergeben, ohne sie manuell angeben zu müssen.

Ä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 cmdlet Out-File auf. Aus diesem Grund können Sie die Standardcodierung von ihnen mit der Einstellungsvariablen $PSDefaultParameterValues festlegen, wie in diesem Beispiel gezeigt:

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

Verwenden Sie die folgende Anweisung, um die Standardcodierung für alle Cmdlets zu ändern, die den parameter Encoding aufweisen.

$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, damit sie sich auf die gleiche Weise verhalten. 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 von PowerShell aus, die für die Kommunikation mit externen Programmen verwendet wird. Es hat keine Auswirkungen auf die Codierung, die die Ausgabeumleitungsoperatoren und PowerShell-Cmdlets zum Speichern in Dateien verwenden.

Siehe auch