Tekencodering herstellen in PowerShell

Schrijft je script é of ? in plaats van é, of toont de console rare tekens? Windows PowerShell 5.1 gebruikt per commando een andere codering. Hier staan de oorzaken en de juiste parameters, en kapotte bestanden herstel je hierboven in je browser.

Werkt met tekst en met deze bestanden:

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

Bijvoorbeeld exports uit Excel, databaseback-ups, ondertitels of websitecode.

Herstellen

  1. Sleep een bestand hierheen of plak tekst
  2. Het herstellen gaat automatisch
  3. Kopieer of download
of sleep een bestand hierheen

Het grondprobleem: elk commando een andere codering

In Windows PowerShell 5.1 heeft bijna elk commando een eigen standaardcodering: Get-Content leest bestanden zonder BOM als ANSI (Windows-1252), Out-File en > schrijven UTF-16, Set-Content schrijft ANSI en Export-Csv ASCII. PowerShell 7 heeft dit gelijkgetrokken en gebruikt overal UTF-8 zonder BOM.

Een UTF-8-bestand gelezen met Get-Content in PowerShell 5.1

Voor

Gebruiker;Afdeling;Vestiging
Zoë de Bruijn;Verkoop;Doetinchem
Renée Müller;Inkoop;Genève

Na

Gebruiker;Afdeling;Vestiging
Zoë de Bruijn;Verkoop;Doetinchem
Renée Müller;Inkoop;Genève

Bestanden goed lezen en schrijven

  • Get-Content data.csv -Encoding UTF8 leest UTF-8-bestanden goed, ook zonder BOM.
  • Set-Content, Out-File en Add-Content schrijven met -Encoding UTF8 UTF-8, in 5.1 altijd met BOM.
  • Export-Csv data.csv -Encoding UTF8 -NoTypeInformation in plaats van de ASCII-standaard, die letters met accenten door ? vervangt.
  • Voor alle commando’s tegelijk: $PSDefaultParameterValues['*:Encoding'] = 'utf8' bovenaan het script.

Webverzoeken met Invoke-RestMethod en Invoke-WebRequest

Geeft een server in de Content-Type geen tekenset op, dan decodeert Windows PowerShell 5.1 het antwoord als ISO-8859-1. UTF-8-antwoorden bevatten dan é. De oplossing: haal het antwoord als bytes op en decodeer het zelf, bijvoorbeeld met [Text.Encoding]::UTF8.GetString((Invoke-WebRequest $url).RawContentStream.ToArray()).

Scriptbestanden met bijzondere tekens

Sla je een script op als UTF-8 zonder BOM, dan leest Windows PowerShell 5.1 het als ANSI. Tekens in teksten als Write-Host "Café" worden dan Café. Sla .ps1-bestanden op als UTF-8 met BOM: in VS Code via de codering in de statusbalk, in Notepad++ via Codering → UTF-8-BOM.

De console

Toont alleen het consolevenster verkeerde tekens zoals ├⌐ in plaats van é, dan is het bestand vaak in orde: de console leest UTF-8 als DOS-codepagina 437. Zet de uitvoer om met [Console]::OutputEncoding = [Text.Encoding]::UTF8. Voor uitvoer die je naar externe programma’s pipet, stel je ook $OutputEncoding = [Text.Encoding]::UTF8 in.

Is het bestand al kapot geschreven, sleep het dan naar het vak hierboven: Mojibuster herstelt é en soortgelijke fouten en zet ANSI-bestanden om naar UTF-8. Staan er al vraagtekens in het bestand, dan is de tekst verloren, zie vraagtekens in plaats van letters.

Veelgestelde vragen

Welke PowerShell-versie heb ik?

$PSVersionTable.PSVersion toont het. 5.1 is de Windows PowerShell die in Windows zit; vanaf 7 heet het gewoon PowerShell en geldt UTF-8 als standaard.

Waarom opent Excel mijn CSV uit PowerShell verkeerd?

PowerShell 7 schrijft UTF-8 zonder BOM en dat herkent Excel niet. Gebruik -Encoding utf8BOM of sla het bestand met BOM op in Mojibuster. Meer over Excel dat rare tekens toont.

Heb ik chcp 65001 nodig?

Alleen voor programma’s die de codepagina van de console volgen. Binnen PowerShell volstaat [Console]::OutputEncoding.

Meer uitleg