Fiks tegnkoding i PowerShell

Skriver skriptet ditt ø eller ? i stedet for ø, eller viser konsollen ødelagt tekst? Windows PowerShell 5.1 bruker ulik koding avhengig av kommandoen. Her er årsakene og de riktige parameterne – og ødelagte filer kan du reparere i nettleseren ovenfor.

Fungerer med tekst og med disse filene:

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

For eksempel eksporter fra Excel, databasesikkerhetskopier, undertekster eller kode fra nettsider.

Fiks

  1. Dra en fil hit eller lim inn tekst
  2. Fiksingen skjer automatisk
  3. Kopier eller last ned
eller dra en fil hit

Rotproblemet: hver kommando har sin egen koding

I Windows PowerShell 5.1 har nesten hver kommando sin egen standardkoding: Get-Content leser filer uten BOM som ANSI (Windows-1252), Out-File og > skriver UTF-16, Set-Content skriver ANSI og Export-Csv ASCII. PowerShell 7 har gjort dette enhetlig og bruker UTF-8 uten BOM overalt.

En UTF-8-fil lest med Get-Content i PowerShell 5.1

Før

Bruker;Avdeling;Kontor
Bjørn Æreberg;Salg;Ålesund
Åse Haugerød;Innkjøp;Tromsø

Etter

Bruker;Avdeling;Kontor
Bjørn Æreberg;Salg;Ålesund
Åse Haugerød;Innkjøp;Tromsø

Les og skriv filer riktig

  • Get-Content data.csv -Encoding UTF8 leser UTF-8-filer riktig, også uten BOM.
  • Set-Content, Out-File og Add-Content skriver UTF-8 med -Encoding UTF8 – i 5.1 alltid med BOM.
  • Export-Csv data.csv -Encoding UTF8 -NoTypeInformation i stedet for ASCII-standarden, som erstatter æøå med ?.
  • For alle kommandoer på én gang: $PSDefaultParameterValues['*:Encoding'] = 'utf8' øverst i skriptet.

Nettkall med Invoke-RestMethod og Invoke-WebRequest

Oppgir ikke serveren noe tegnsett i Content-Type, avkoder Windows PowerShell 5.1 svaret som ISO-8859-1. UTF-8-svar inneholder da ø. Løsningen: hent svaret som byte og avkod det selv, for eksempel med [Text.Encoding]::UTF8.GetString((Invoke-WebRequest $url).RawContentStream.ToArray()).

Skriptfiler med æøå

Lagrer du et skript som UTF-8 uten BOM, leser Windows PowerShell 5.1 det som ANSI. Tegn i strenger som Write-Host "Rødgrøt" vises da som Rødgrøt. Lagre .ps1-filer som UTF-8 med BOM – i VS Code via kodingen i statuslinjen, i Notepad++ via Encoding → UTF-8-BOM.

Konsollen

Viser bare konsollvinduet gale tegn som ├╕ i stedet for ø, er filen ofte i orden – konsollen leser UTF-8 som DOS-tegntabellen 437. Bytt utdataene med [Console]::OutputEncoding = [Text.Encoding]::UTF8. For utdata du sender videre til eksterne programmer, sett også $OutputEncoding = [Text.Encoding]::UTF8.

Er filen allerede skrevet ødelagt, slipper du den i feltet ovenfor: Mojibuster fikser ø og lignende og konverterer ANSI-filer til UTF-8. Inneholder filen allerede spørsmålstegn, er teksten tapt – se spørsmålstegn i stedet for bokstaver.

Ofte stilte spørsmål

Hvilken PowerShell-versjon har jeg?

$PSVersionTable.PSVersion viser den. 5.1 er Windows PowerShell som er innebygd i Windows; fra 7 heter den bare PowerShell og bruker UTF-8 som standard.

Hvorfor åpner Excel CSV-en min fra PowerShell feil?

PowerShell 7 skriver UTF-8 uten BOM, som Excel ikke gjenkjenner. Bruk -Encoding utf8BOM, eller lagre filen med BOM i Mojibuster. Mer under Excel viser rare tegn.

Trenger jeg chcp 65001?

Bare for programmer som følger konsollens tegntabell. Innenfor PowerShell holder [Console]::OutputEncoding.

Les mer