Cara memperbaiki encoding karakter di PowerShell

Skrip Anda menulis é atau ? alih-alih é, atau konsol menampilkan karakter aneh? Windows PowerShell 5.1 memakai encoding berbeda untuk tiap perintah. Berikut penyebab dan parameter yang tepat, dan file yang sudah rusak bisa Anda perbaiki di browser di atas.

Bisa untuk teks dan file berikut:

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

Misalnya ekspor Excel, dump database, subtitle, atau kode situs web.

Perbaiki

  1. Letakkan file atau tempel teks
  2. Langsung diperbaiki otomatis
  3. Salin atau unduh
atau seret file ke sini
  • Tanpa upload. File Anda diperbaiki langsung di browser dan tidak pernah meninggalkan perangkat Anda.

  • Server di Uni Eropa. Mojibuster berjalan di server di Finlandia (Uni Eropa), sehingga berlaku Peraturan Perlindungan Data Umum (GDPR). Baca GDPR (EUR-Lex, dalam bahasa Inggris)

Akar masalahnya: setiap perintah punya encoding sendiri

Di Windows PowerShell 5.1, hampir setiap perintah punya encoding bawaan sendiri: Get-Content membaca file tanpa BOM sebagai ANSI (Windows-1252), Out-File dan > menulis UTF-16, Set-Content menulis ANSI, dan Export-Csv menulis ASCII. PowerShell 7 menyeragamkannya dan memakai UTF-8 tanpa BOM di mana-mana.

File UTF-8 yang dibaca dengan Get-Content di PowerShell 5.1

Sebelum

Pengguna;Divisi;Kantor
René Müller;Penjualan;Zürich
José García;Pembelian;Málaga

Sesudah

Pengguna;Divisi;Kantor
René Müller;Penjualan;Zürich
José García;Pembelian;Málaga

Membaca dan menulis file dengan benar

  • Get-Content data.csv -Encoding UTF8 membaca file UTF-8 dengan benar, juga tanpa BOM.
  • Set-Content, Out-File, dan Add-Content menulis UTF-8 dengan -Encoding UTF8, di 5.1 selalu dengan BOM.
  • Export-Csv data.csv -Encoding UTF8 -NoTypeInformation sebagai ganti bawaan ASCII, yang mengganti huruf beraksen dengan ?.
  • Untuk semua perintah sekaligus: $PSDefaultParameterValues['*:Encoding'] = 'utf8' di awal skrip.

Permintaan web dengan Invoke-RestMethod dan Invoke-WebRequest

Kalau server tidak menyebut charset di Content-Type, Windows PowerShell 5.1 membaca respons sebagai ISO-8859-1. Respons UTF-8 lalu berisi é. Solusinya: ambil respons sebagai byte dan decode sendiri, misalnya dengan [Text.Encoding]::UTF8.GetString((Invoke-WebRequest $url).RawContentStream.ToArray()).

File skrip dengan karakter khusus

Kalau Anda menyimpan skrip sebagai UTF-8 tanpa BOM, Windows PowerShell 5.1 membacanya sebagai ANSI. Karakter dalam string seperti Write-Host "Café" lalu tampil sebagai Café. Simpan file .ps1 sebagai UTF-8 dengan BOM: di VS Code lewat encoding di bilah status, di Notepad++ lewat Encoding → UTF-8-BOM.

Konsol

Kalau hanya jendela konsol yang menampilkan karakter salah seperti ├⌐ alih-alih é, file-nya sering baik-baik saja: konsol membaca UTF-8 sebagai code page DOS 437. Ubah outputnya dengan [Console]::OutputEncoding = [Text.Encoding]::UTF8. Untuk output yang dialirkan ke program eksternal, atur juga $OutputEncoding = [Text.Encoding]::UTF8.

Kalau file sudah telanjur tertulis rusak, seret ke kotak di atas: Mojibuster memperbaiki é dan sejenisnya serta mengubah file ANSI menjadi UTF-8. Kalau file sudah berisi tanda tanya, teksnya hilang, lihat tanda tanya pengganti huruf.

Pertanyaan yang sering diajukan

PowerShell versi berapa yang saya pakai?

$PSVersionTable.PSVersion menampilkannya. 5.1 adalah Windows PowerShell bawaan Windows; mulai 7 namanya cukup PowerShell dan UTF-8 menjadi bawaan.

Kenapa Excel membuka CSV dari PowerShell dengan salah?

PowerShell 7 menulis UTF-8 tanpa BOM, yang tidak dikenali Excel. Pakai -Encoding utf8BOM atau simpan file dengan BOM di Mojibuster. Selengkapnya di karakter aneh di Excel.

Apakah saya perlu chcp 65001?

Hanya untuk program yang mengikuti code page konsol. Di dalam PowerShell, [Console]::OutputEncoding sudah cukup.

Panduan lainnya