Laga teckenkodning i PowerShell

Skriver ditt skript ä eller ? i stället för ä, eller visar konsolen trasig text? Windows PowerShell 5.1 använder olika kodning beroende på kommando. Här är orsakerna och rätt parametrar – och trasiga filer lagar du i webbläsaren ovan.

Fungerar med text och med de här filerna:

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

Till exempel exporter från Excel, databasbackuper, undertexter eller webbplatskod.

Fixa

  1. Dra hit en fil eller klistra in text
  2. Fixen sker automatiskt
  3. Kopiera eller ladda ner
eller dra hit en fil

Grundproblemet: varje kommando har sin egen kodning

I Windows PowerShell 5.1 har nästan varje kommando sin egen standardkodning: Get-Content läser filer utan BOM som ANSI (Windows-1252), Out-File och > skriver UTF-16, Set-Content skriver ANSI och Export-Csv ASCII. PowerShell 7 har gjort detta enhetligt och använder UTF-8 utan BOM överallt.

En UTF-8-fil som lästs med Get-Content i PowerShell 5.1

Före

Användare;Avdelning;Kontor
Åsa Lindström;Försäljning;Malmö
Björn Öberg;Inköp;Västerås

Efter

Användare;Avdelning;Kontor
Åsa Lindström;Försäljning;Malmö
Björn Öberg;Inköp;Västerås

Läs och skriv filer rätt

  • Get-Content data.csv -Encoding UTF8 läser UTF-8-filer rätt även utan BOM.
  • Set-Content, Out-File och Add-Content skriver UTF-8 med -Encoding UTF8 – i 5.1 alltid med BOM.
  • Export-Csv data.csv -Encoding UTF8 -NoTypeInformation i stället för ASCII-standarden, som ersätter åäö med ?.
  • För alla kommandon på en gång: $PSDefaultParameterValues['*:Encoding'] = 'utf8' överst i skriptet.

Webbanrop med Invoke-RestMethod och Invoke-WebRequest

Anger en server ingen teckenuppsättning i Content-Type avkodar Windows PowerShell 5.1 svaret som ISO-8859-1. UTF-8-svar innehåller då ä. Lösningen: hämta svaret som byte och avkoda det själv, till exempel med [Text.Encoding]::UTF8.GetString((Invoke-WebRequest $url).RawContentStream.ToArray()).

Skriptfiler med åäö

Sparar du ett skript som UTF-8 utan BOM läser Windows PowerShell 5.1 det som ANSI. Tecken i strängar som Write-Host "Smörgås" visas då som SmörgÃ¥s. Spara .ps1-filer som UTF-8 med BOM – i VS Code via kodningen i statusfältet, i Notepad++ via Encoding → UTF-8-BOM.

Konsolen

Visar bara konsolfönstret fel tecken som ├ñ i stället för ä är filen ofta hel – konsolen läser UTF-8 som DOS-teckentabellen 437. Byt utmatningen med [Console]::OutputEncoding = [Text.Encoding]::UTF8. För utdata du skickar till externa program, sätt även $OutputEncoding = [Text.Encoding]::UTF8.

Har filen redan skrivits trasig, släpp den i rutan ovan: Mojibuster lagar ä och liknande och konverterar ANSI-filer till UTF-8. Innehåller filen redan frågetecken är texten förlorad – se frågetecken i stället för åäö.

Vanliga frågor

Vilken PowerShell-version har jag?

$PSVersionTable.PSVersion visar den. 5.1 är Windows PowerShell som ingår i Windows; från 7 heter det bara PowerShell och använder UTF-8 som standard.

Varför öppnar Excel min CSV från PowerShell fel?

PowerShell 7 skriver UTF-8 utan BOM, vilket Excel inte känner igen. Använd -Encoding utf8BOM eller spara filen med BOM i Mojibuster. Mer under Excel visar konstiga tecken.

Behöver jag chcp 65001?

Bara för program som följer konsolens teckentabell. Inom PowerShell räcker [Console]::OutputEncoding.

Mer att läsa