Karakterkódolás javítása PowerShellben

A szkripted Ă© vagy ? jelet ír é helyett, vagy a konzol értelmetlen szöveget mutat? A Windows PowerShell 5.1 parancsonként más kódolást használ. Itt az okok és a helyes paraméterek – a már elromlott fájlokat pedig fent a böngészőben kijavíthatod.

Szöveggel és fájlokkal is működik:

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

Például Excel-exportok, adatbázis-mentések, feliratok vagy weboldalak forráskódja.

Javítás

  1. Húzd ide a fájlt, vagy illeszd be a szöveget
  2. A javítás automatikusan megtörténik
  3. Másold ki vagy töltsd le
vagy egyszerűen húzd ide a fájlt

A gyökérprobléma: minden parancs más kódolást használ

A Windows PowerShell 5.1-ben szinte minden parancsnak saját alapértelmezett kódolása van: a Get-Content a BOM nélküli fájlokat ANSI-ként olvassa – magyar Windowson ez a Windows-1250 –, az Out-File és a > UTF-16-ot ír, a Set-Content ANSI-t, az Export-Csv pedig ASCII-t. A PowerShell 7 ezt egységesítette, és mindenhol BOM nélküli UTF-8-at használ.

Egy UTF-8 fájl beolvasva Get-Content-tel PowerShell 5.1-ben

Előtte

Felhasználó;Osztály;Iroda
Tóth Béla;Értékesítés;Győr
Szűcs Gergő;Beszerzés;Pécs

Utána

Felhasználó;Osztály;Iroda
Tóth Béla;Értékesítés;Győr
Szűcs Gergő;Beszerzés;Pécs

Fájlok helyes olvasása és írása

  • A Get-Content adatok.csv -Encoding UTF8 a BOM nélküli UTF-8 fájlokat is helyesen olvassa.
  • A Set-Content, Out-File és Add-Content az -Encoding UTF8 megadásával UTF-8-at ír – az 5.1-ben mindig BOM-mal.
  • Az Export-Csv adatok.csv -Encoding UTF8 -NoTypeInformation az ASCII alapértelmezés helyett, amely az ékezetes betűket ? jellel helyettesíti.
  • Az összes parancsra egyszerre: $PSDefaultParameterValues['*:Encoding'] = 'utf8' a szkript elején.

Webes kérések: Invoke-RestMethod és Invoke-WebRequest

Ha a szerver a Content-Type fejlécben nem ad meg karakterkészletet, a Windows PowerShell 5.1 a választ ISO-8859-1-ként dekódolja. Az UTF-8 válaszokban ekkor Ă©-szerű hibák jelennek meg. A megoldás: a választ bájtként kérd le, és te dekódold, például így: [Text.Encoding]::UTF8.GetString((Invoke-WebRequest $url).RawContentStream.ToArray()).

Szkriptfájlok különleges karakterekkel

Ha a szkriptet BOM nélküli UTF-8-ként mented, a Windows PowerShell 5.1 ANSI-ként olvassa. A Write-Host "Győr"-féle sztringekben a karakterek elromlanak. Mentsd a .ps1 fájlokat BOM-os UTF-8-ként – a VS Code-ban az állapotsor kódolás-jelzőjénél, a Notepad++ programban az Encoding menü UTF-8-BOM pontjával.

A konzol

Ha csak a konzolablakban látsz rossz karaktereket, a fájl gyakran rendben van – a konzol az UTF-8 szöveget DOS-os kódlapként (közép-európai Windowson 852) olvassa. Állítsd át a kimenetet: [Console]::OutputEncoding = [Text.Encoding]::UTF8. A külső programoknak átadott kimenethez állítsd be a $OutputEncoding = [Text.Encoding]::UTF8 értéket is.

Ha a fájl már elromolva íródott ki, húzd a fenti mezőbe: a Mojibuster kijavítja a Ă©-szerű hibákat, és az ANSI (Windows-1250) fájlokat UTF-8-ra alakítja. Ha a fájlban már kérdőjelek vannak, a szöveg elveszett. A jelenségről a mi az a mojibake oldalon olvashatsz.

Gyakori kérdések

Melyik PowerShell-verzióm van?

A $PSVersionTable.PSVersion megmutatja. Az 5.1 a Windowsba épített Windows PowerShell; a 7-től egyszerűen PowerShellnek hívják, és alapból UTF-8-at használ.

Miért nyitja meg rosszul az Excel a PowerShellből írt CSV-met?

A PowerShell 7 BOM nélküli UTF-8-at ír, amelyet az Excel nem ismer fel. Használd az -Encoding utf8BOM kapcsolót, vagy mentsd a fájlt BOM-mal a Mojibusterben. Többet az Excel CSV ékezetes betűiről szóló oldalon találsz.

Kell a chcp 65001?

Csak azoknak a programoknak, amelyek a konzol kódlapját követik. A PowerShellen belül elég a [Console]::OutputEncoding.

További útmutatók