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 UTF7
immer 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 mitUnicode
.Unicode
Verwendet UTF-16 mit der Little-Endian Byte-Reihenfolge.Unknown
Identisch mitUnicode
.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 vonSet-Content
undAdd-Content
.New-ModuleManifest
undExport-CliXml
auch UTF-16LE-Dateien erstellen.Wenn die Zieldatei leer ist oder nicht vorhanden ist,
Set-Content
undAdd-Content
verwenden SieDefault
die Codierung.Default
ist die Codierung, die durch die ANSI-Legacycodeseite des aktiven Systemgebietsschemas angegeben wird.Export-Csv
erstelltAscii
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
verwendetDefault
standardmäßig Codierung.Start-Transcript
erstelltUtf8
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 istAdd-Content
in PowerShell (v6 und höher) identisch, es sei denn, die Standardcodierung istUtf8
.Export-Csv -Append
entspricht der vorhandenen Codierung, wenn die Zieldatei eine BOM enthält. Wenn keine BOM vorhanden ist, wird die Codierung verwendetUtf8
.Start-Transcript -Append
entspricht der vorhandenen Codierung von Dateien, die eine BOM enthalten. Wenn keine BOM vorhanden ist, wirdAscii
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
undImport-PowerShellDataFile
verwendet dieDefault
ANSI-Codierung. ANSI verwendet auch das PowerShell-Modul, wenn es Quellcode aus Dateien liest.Import-Csv
,Import-CliXml
undSelect-String
gehen Sie davon ausUtf8
, 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.