Grundproblemet: hver kommando har sin egen kodning
I Windows PowerShell 5.1 har næsten hver kommando sin egen standardkodning: Get-Content læser filer uden BOM som ANSI (Windows-1252), Out-File og > skriver UTF-16, Set-Content skriver ANSI og Export-Csv ASCII. PowerShell 7 har gjort det ensartet og bruger UTF-8 uden BOM overalt.
Før
Bruger;Afdeling;Kontor Søren Ærø;Salg;Ålborg Åse Lindhøj;Indkøb;Næstved
Efter
Bruger;Afdeling;Kontor Søren Ærø;Salg;Ålborg Åse Lindhøj;Indkøb;Næstved
Læs og skriv filer korrekt
Get-Content data.csv -Encoding UTF8læser UTF-8-filer korrekt, også uden BOM.Set-Content,Out-FileogAdd-Contentskriver UTF-8 med-Encoding UTF8– i 5.1 altid med BOM.Export-Csv data.csv -Encoding UTF8 -NoTypeInformationi stedet for ASCII-standarden, som erstatter æøå med?.- Til alle kommandoer på én gang:
$PSDefaultParameterValues['*:Encoding'] = 'utf8'øverst i scriptet.
Webkald med Invoke-RestMethod og Invoke-WebRequest
Angiver en server ikke noget tegnsæt i Content-Type, afkoder Windows PowerShell 5.1 svaret som ISO-8859-1. UTF-8-svar indeholder så ø. Løsningen: hent svaret som bytes og afkod det selv, fx med [Text.Encoding]::UTF8.GetString((Invoke-WebRequest $url).RawContentStream.ToArray()).
Scriptfiler med æøå
Gemmer du et script som UTF-8 uden BOM, læser Windows PowerShell 5.1 det som ANSI. Tegn i strenge som Write-Host "Rødgrød" vises så som Rødgrød. Gem .ps1-filer som UTF-8 med BOM – i VS Code via kodningen i statuslinjen, i Notepad++ via Encoding → UTF-8-BOM.
Konsollen
Viser kun konsolvinduet forkerte tegn som ├╕ i stedet for ø, er filen ofte i orden – konsollen læser UTF-8 som DOS-tegntabellen 437. Skift outputtet med [Console]::OutputEncoding = [Text.Encoding]::UTF8. Til output, du sender videre til eksterne programmer, sæt også $OutputEncoding = [Text.Encoding]::UTF8.
Er filen allerede skrevet ødelagt, så slip den i feltet ovenfor: Mojibuster retter ø og lignende og konverterer ANSI-filer til UTF-8. Indeholder filen allerede spørgsmålstegn, er teksten tabt – se spørgsmålstegn i stedet for bogstaver.
Ofte stillede spørgsmål
Hvilken PowerShell-version har jeg?
$PSVersionTable.PSVersion viser den. 5.1 er den Windows PowerShell, der er indbygget i Windows; fra 7 hedder den blot PowerShell og bruger UTF-8 som standard.
Hvorfor åbner Excel min CSV fra PowerShell forkert?
PowerShell 7 skriver UTF-8 uden BOM, som Excel ikke genkender. Brug -Encoding utf8BOM, eller gem filen med BOM i Mojibuster. Mere under Excel viser mærkelige tegn.
Skal jeg bruge chcp 65001?
Kun til programmer, der følger konsollens tegntabel. Inden for PowerShell er [Console]::OutputEncoding nok.