Popravak kodiranja znakova u PowerShellu

Vaša skripta piše ÄŤ ili ? umjesto č, ili konzola prikazuje nečitljiv tekst? Windows PowerShell 5.1 koristi različito kodiranje ovisno o naredbi. Evo uzroka i pravih parametara – a već pokvarene datoteke možete popraviti u pregledniku iznad.

Radi s tekstom i datotekama:

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

Na primjer izvozi iz Excela, ispisi baza podataka, titlovi za filmove ili kod web-stranica.

Popravi

  1. Povucite datoteku ili zalijepite tekst
  2. Popravak se odvija automatski
  3. Kopirajte ili preuzmite
ili jednostavno povucite datoteku ovamo

Korijen problema: svaka naredba, drugo kodiranje

U Windows PowerShellu 5.1 gotovo svaka naredba ima vlastito zadano kodiranje: Get-Content čita datoteke bez BOM-a kao ANSI – na hrvatskom Windowsu to je Windows-1250 –, Out-File i > pišu UTF-16, Set-Content piše ANSI, a Export-Csv ASCII. PowerShell 7 je to ujednačio i svugdje koristi UTF-8 bez BOM-a.

UTF-8 datoteka pročitana s Get-Content u PowerShellu 5.1

Prije

Korisnik;Odjel;Ured
Željko Čačić;Prodaja;Osijek
Ivana Kučić;Nabava;Zadar

Poslije

Korisnik;Odjel;Ured
Željko Čačić;Prodaja;Osijek
Ivana Kučić;Nabava;Zadar

Ispravno čitanje i pisanje datoteka

  • Get-Content podaci.csv -Encoding UTF8 ispravno čita UTF-8 datoteke i bez BOM-a.
  • Set-Content, Out-File i Add-Content pišu UTF-8 uz -Encoding UTF8 – u 5.1 uvijek s BOM-om.
  • Export-Csv podaci.csv -Encoding UTF8 -NoTypeInformation umjesto zadanog ASCII-ja, koji kvačice zamjenjuje s ?.
  • Za sve naredbe odjednom: $PSDefaultParameterValues['*:Encoding'] = 'utf8' na početku skripte.

Web zahtjevi: Invoke-RestMethod i Invoke-WebRequest

Ako poslužitelj u zaglavlju Content-Type ne navede skup znakova, Windows PowerShell 5.1 dekodira odgovor kao ISO-8859-1. UTF-8 odgovori tada sadrže pogreške poput ÄŤ. Rješenje: dohvatite odgovor kao bajtove i sami ga dekodirajte, npr. ovako: [Text.Encoding]::UTF8.GetString((Invoke-WebRequest $url).RawContentStream.ToArray()).

Skriptne datoteke s posebnim znakovima

Ako skriptu spremite kao UTF-8 bez BOM-a, Windows PowerShell 5.1 čita je kao ANSI. Znakovi u nizovima poput Write-Host "Čačak" tada se pokvare. Spremajte .ps1 datoteke kao UTF-8 s BOM-om – u VS Codeu preko kodiranja u statusnoj traci, u Notepad++ preko izbornika Encoding → UTF-8-BOM.

Konzola

Ako samo prozor konzole prikazuje pogrešne znakove, datoteka je često u redu – konzola UTF-8 čita kao DOS kodnu stranicu (na srednjoeuropskom Windowsu 852). Prebacite izlaz naredbom [Console]::OutputEncoding = [Text.Encoding]::UTF8. Za izlaz koji prosljeđujete vanjskim programima postavite i $OutputEncoding = [Text.Encoding]::UTF8.

Ako je datoteka već zapisana pokvarena, povucite je u polje iznad: Mojibuster popravlja ÄŤ i slične pogreške te pretvara ANSI (Windows-1250) datoteke u UTF-8. Ako datoteka već sadrži upitnike, tekst je izgubljen. Više o pojavi na stranici što je mojibake.

Česta pitanja

Koju verziju PowerShella imam?

Prikazuje je $PSVersionTable.PSVersion. 5.1 je Windows PowerShell ugrađen u Windows; od 7 zove se samo PowerShell i zadano koristi UTF-8.

Zašto Excel pogrešno otvara moj CSV iz PowerShella?

PowerShell 7 piše UTF-8 bez BOM-a, što Excel ne prepoznaje. Koristite -Encoding utf8BOM ili spremite datoteku s BOM-om u Mojibusteru. Više na stranici o CSV-u i kvačicama u Excelu.

Treba li mi chcp 65001?

Samo za programe koji prate kodnu stranicu konzole. Unutar PowerShella dovoljan je [Console]::OutputEncoding.

Više uputa