Umlaute in PowerShell: Encoding richtig einstellen

Dein Skript schreibt ä oder ? statt ä, oder die Konsole zeigt Zeichensalat? Windows PowerShell 5.1 nutzt je nach Befehl eine andere Kodierung. Hier sind die Ursachen und die passenden Parameter – kaputte Dateien reparierst du oben im Browser.

Funktioniert mit Text und diesen Dateien:

  • CSV
  • TXT
  • JSON
  • XML
  • SRT
  • VTT
  • TSV
  • MD
  • HTML
  • SQL
  • LOG

Zum Beispiel Excel-Exporte, Datenbank-Dumps, Untertitel oder Website-Code.

Reparieren

  1. Datei ablegen oder Text einfügen
  2. Wird automatisch repariert
  3. Kopieren oder herunterladen
oder Datei einfach hierher ziehen

Das Grundproblem: jeder Befehl eine andere Kodierung

In Windows PowerShell 5.1 hat fast jeder Befehl seine eigene Standardkodierung: Get-Content liest Dateien ohne BOM als ANSI (Windows-1252), Out-File und > schreiben UTF-16, Set-Content schreibt ANSI und Export-Csv ASCII. PowerShell 7 hat das vereinheitlicht und nutzt überall UTF-8 ohne BOM.

Eine UTF-8-Datei, mit Get-Content in PowerShell 5.1 gelesen

Vorher

Benutzer;Abteilung;Standort
Jörg Weiß;Vertrieb;München
Renée Groß;Einkauf;Köln

Nachher

Benutzer;Abteilung;Standort
Jörg Weiß;Vertrieb;München
Renée Groß;Einkauf;Köln

Dateien richtig lesen und schreiben

  • Get-Content daten.csv -Encoding UTF8 liest UTF-8-Dateien auch ohne BOM richtig.
  • Set-Content, Out-File und Add-Content schreiben mit -Encoding UTF8 UTF-8 – in 5.1 immer mit BOM.
  • Export-Csv daten.csv -Encoding UTF8 -NoTypeInformation statt des ASCII-Standards, der Umlaute durch ? ersetzt.
  • Für alle Befehle auf einmal: $PSDefaultParameterValues['*:Encoding'] = 'utf8' am Anfang des Skripts.

Webanfragen mit Invoke-RestMethod und Invoke-WebRequest

Gibt ein Server im Content-Type keinen Zeichensatz an, dekodiert Windows PowerShell 5.1 die Antwort als ISO-8859-1. UTF-8-Antworten enthalten dann ä. Abhilfe: die Antwort als Bytes holen und selbst dekodieren, etwa mit [Text.Encoding]::UTF8.GetString((Invoke-WebRequest $url).RawContentStream.ToArray()).

Skriptdateien mit Umlauten

Speicherst du ein Skript als UTF-8 ohne BOM, liest Windows PowerShell 5.1 es als ANSI. Umlaute in Texten wie Write-Host "Größe" erscheinen dann als Größe. Speichere .ps1-Dateien deshalb als UTF-8 mit BOM – in VS Code über die Kodierung unten rechts, in Notepad++ über Kodierung → UTF-8-BOM.

Die Konsole

Zeigt nur das Konsolenfenster falsche Zeichen, ist die Datei oft in Ordnung. Stelle die Ausgabe mit [Console]::OutputEncoding = [Text.Encoding]::UTF8 um. Für Ausgaben, die du an externe Programme weitergibst, gilt zusätzlich $OutputEncoding = [Text.Encoding]::UTF8.

Ist die Datei schon kaputt geschrieben, zieh sie oben hinein: Mojibuster repariert ä und Co. und wandelt ANSI-Dateien in UTF-8 um. Stehen schon Fragezeichen in der Datei, ist der Text verloren – siehe Fragezeichen statt Umlaute.

Häufige Fragen

Welche PowerShell-Version habe ich?

$PSVersionTable.PSVersion zeigt sie an. 5.1 ist die in Windows eingebaute Windows PowerShell, ab 7 heißt sie nur noch PowerShell und nutzt UTF-8 als Standard.

Warum öffnet Excel meine CSV aus PowerShell falsch?

PowerShell 7 schreibt UTF-8 ohne BOM, das erkennt Excel nicht. Nutze -Encoding utf8BOM oder speichere die Datei in Mojibuster mit BOM. Mehr unter Excel zeigt Umlaute falsch.

Brauche ich chcp 65001?

Nur für Programme, die sich nach der Codepage der Konsole richten. Innerhalb von PowerShell reicht [Console]::OutputEncoding.

Weitere Anleitungen