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.
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 UTF8membaca file UTF-8 dengan benar, juga tanpa BOM.Set-Content,Out-File, danAdd-Contentmenulis UTF-8 dengan-Encoding UTF8, di 5.1 selalu dengan BOM.Export-Csv data.csv -Encoding UTF8 -NoTypeInformationsebagai 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.