Korjaa merkistökoodaus PowerShellissä

Kirjoittaako komentosarjasi ä tai ? merkin ä sijaan, tai näyttääkö konsoli sekavaa tekstiä? Windows PowerShell 5.1 käyttää komennosta riippuen eri koodausta. Tässä syyt ja oikeat parametrit – ja rikkinäiset tiedostot voit korjata selaimessa yllä.

Toimii tekstin ja näiden tiedostojen kanssa:

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

Esimerkiksi Excel-viennit, tietokantavarmuuskopiot, tekstitykset tai verkkosivujen koodi.

Korjaa

  1. Pudota tiedosto tai liitä teksti
  2. Korjaus tapahtuu automaattisesti
  3. Kopioi tai lataa
tai pudota tiedosto tähän

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ä.

UTF-8-tiedosto luettuna Get-Contentilla PowerShellissä 5.1

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 UTF8 lukee UTF-8-tiedostot oikein myös ilman BOM-merkkiä.
  • Set-Content, Out-File ja Add-Content kirjoittavat UTF-8:aa valinnalla -Encoding UTF8 – versiossa 5.1 aina BOM-merkin kanssa.
  • Export-Csv data.csv -Encoding UTF8 -NoTypeInformation ASCII-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.

Lue lisää