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.
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 UTF8a BOM nélküli UTF-8 fájlokat is helyesen olvassa. - A
Set-Content,Out-FileésAdd-Contentaz-Encoding UTF8megadásával UTF-8-at ír – az 5.1-ben mindig BOM-mal. - Az
Export-Csv adatok.csv -Encoding UTF8 -NoTypeInformationaz 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.