Perusongelma: jokaisella komennolla on oma koodauksensa
Windows PowerShell 5.1:ssä lähes jokaisella komennolla on oma oletuskoodauksensa: Get-Content lukee tiedostot ilman BOM-merkkiä ANSI-muodossa (Windows-1252), Out-File ja > kirjoittavat UTF-16:ta, Set-Content ANSI:a ja Export-Csv ASCII:a. PowerShell 7 yhtenäisti tämän ja käyttää kaikkialla UTF-8:aa ilman BOM-merkkiä.
Ennen
Käyttäjä;Osasto;Toimisto Päivi Ääläinen;Myynti;Jyväskylä Töhö Mäkelä;Ostot;Hämeenlinna
Jälkeen
Käyttäjä;Osasto;Toimisto Päivi Ääläinen;Myynti;Jyväskylä Töhö Mäkelä;Ostot;Hämeenlinna
Lue ja kirjoita tiedostot oikein
Get-Content data.csv -Encoding UTF8lukee UTF-8-tiedostot oikein myös ilman BOM-merkkiä.Set-Content,Out-FilejaAdd-Contentkirjoittavat UTF-8:aa valinnalla-Encoding UTF8– versiossa 5.1 aina BOM-merkin kanssa.Export-Csv data.csv -Encoding UTF8 -NoTypeInformationASCII-oletuksen sijaan, joka korvaa ääkköset?-merkeillä.- Kaikille komennoille kerralla:
$PSDefaultParameterValues['*:Encoding'] = 'utf8'komentosarjan alussa.
Verkkokutsut: Invoke-RestMethod ja Invoke-WebRequest
Jos palvelin ei ilmoita merkistöä Content-Type-otsakkeessa, Windows PowerShell 5.1 tulkitsee vastauksen ISO-8859-1:ksi. UTF-8-vastauksissa on silloin ä. Ratkaisu: hae vastaus tavuina ja pura se itse, esimerkiksi [Text.Encoding]::UTF8.GetString((Invoke-WebRequest $url).RawContentStream.ToArray()).
Komentosarjatiedostot ja ääkköset
Jos tallennat komentosarjan UTF-8:na ilman BOM-merkkiä, Windows PowerShell 5.1 lukee sen ANSI-muodossa. Merkkijonojen merkit, kuten Write-Host "Pääsiäinen", näkyvät silloin muodossa Pääsiäinen. Tallenna .ps1-tiedostot UTF-8:na BOM-merkin kanssa – VS Codessa tilarivin koodauksesta, Notepad++:ssa valinnalla Encoding → UTF-8-BOM.
Konsoli
Jos vain konsoli-ikkuna näyttää vääriä merkkejä, kuten ├ñ merkin ä sijaan, tiedosto on usein kunnossa – konsoli lukee UTF-8:aa DOS-koodisivuna 437. Vaihda tulostus komennolla [Console]::OutputEncoding = [Text.Encoding]::UTF8. Ulkoisille ohjelmille ohjattavaan tulosteeseen aseta myös $OutputEncoding = [Text.Encoding]::UTF8.
Jos tiedosto on jo kirjoitettu rikkinäisenä, pudota se yllä olevaan ruutuun: Mojibuster korjaa ä-merkit ja vastaavat sekä muuntaa ANSI-tiedostot UTF-8:ksi. Jos tiedostossa on jo kysymysmerkkejä, teksti on menetetty – ks. kysymysmerkit kirjainten sijaan.
Usein kysyttyä
Mikä PowerShell-versio minulla on?
$PSVersionTable.PSVersion näyttää sen. 5.1 on Windowsiin sisäänrakennettu Windows PowerShell; versiosta 7 alkaen se on pelkkä PowerShell ja käyttää oletuksena UTF-8:aa.
Miksi Excel avaa PowerShellillä tekemäni CSV:n väärin?
PowerShell 7 kirjoittaa UTF-8:aa ilman BOM-merkkiä, jota Excel ei tunnista. Käytä valintaa -Encoding utf8BOM tai tallenna tiedosto BOM-merkin kanssa Mojibusterissa. Lisää kohdassa Excel näyttää ääkköset väärin.
Tarvitsenko komentoa chcp 65001?
Vain ohjelmille, jotka seuraavat konsolin koodisivua. PowerShellin sisällä riittää [Console]::OutputEncoding.