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.
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 UTF8ispravno čita UTF-8 datoteke i bez BOM-a.Set-Content,Out-FileiAdd-Contentpišu UTF-8 uz-Encoding UTF8– u 5.1 uvijek s BOM-om.Export-Csv podaci.csv -Encoding UTF8 -NoTypeInformationumjesto 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.