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.
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 UTF8leest UTF-8-bestanden goed, ook zonder BOM.Set-Content,Out-FileenAdd-Contentschrijven met-Encoding UTF8UTF-8, in 5.1 altijd met BOM.Export-Csv data.csv -Encoding UTF8 -NoTypeInformationin 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.