Ret tegnkodning i PowerShell

Skriver dit script ø eller ? i stedet for ø, eller viser konsollen ødelagt tekst? Windows PowerShell 5.1 bruger forskellig kodning afhængigt af kommandoen. Her er årsagerne og de rigtige parametre – og ødelagte filer kan du reparere i browseren ovenfor.

Virker med tekst og med disse filer:

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

For eksempel eksporter fra Excel, databasebackups, undertekster eller kode fra hjemmesider.

Ret

  1. Træk en fil herind, eller sæt tekst ind
  2. Rettelsen sker automatisk
  3. Kopiér eller download
eller træk en fil herind

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.

En UTF-8-fil læst med Get-Content i PowerShell 5.1

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 UTF8 læser UTF-8-filer korrekt, også uden BOM.
  • Set-Content, Out-File og Add-Content skriver UTF-8 med -Encoding UTF8 – i 5.1 altid med BOM.
  • Export-Csv data.csv -Encoding UTF8 -NoTypeInformation i 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.

Læs mere