Il problema di fondo: ogni comando, una codifica
In Windows PowerShell 5.1 quasi ogni comando ha la sua codifica predefinita: Get-Content legge i file senza BOM come ANSI (Windows-1252), Out-File e > scrivono UTF-16, Set-Content scrive ANSI ed Export-Csv ASCII. PowerShell 7 ha unificato tutto e usa ovunque UTF-8 senza BOM.
Prima
Utente;Reparto;Sede Niccolò Perché;Vendite;Perugia Giuliana Lù;Acquisti;Città di Castello
Dopo
Utente;Reparto;Sede Niccolò Perché;Vendite;Perugia Giuliana Lù;Acquisti;Città di Castello
Leggere e scrivere i file nel modo giusto
Get-Content dati.csv -Encoding UTF8legge correttamente i file UTF-8 anche senza BOM.Set-Content,Out-FileeAdd-Contentscrivono UTF-8 con-Encoding UTF8; nella 5.1 sempre con BOM.Export-Csv dati.csv -Encoding UTF8 -NoTypeInformational posto dell'ASCII predefinito, che sostituisce le lettere accentate con?.- Per tutti i comandi insieme:
$PSDefaultParameterValues['*:Encoding'] = 'utf8'all'inizio dello script.
Richieste web con Invoke-RestMethod e Invoke-WebRequest
Se un server non indica il charset nel Content-Type, Windows PowerShell 5.1 decodifica la risposta come ISO-8859-1. Le risposte UTF-8 contengono allora è. La soluzione: prendi la risposta come byte e decodificala tu, per esempio con [Text.Encoding]::UTF8.GetString((Invoke-WebRequest $url).RawContentStream.ToArray()).
Script con caratteri speciali
Se salvi uno script come UTF-8 senza BOM, Windows PowerShell 5.1 lo legge come ANSI. I caratteri in stringhe come Write-Host "Perché" compaiono allora come Perché. Salva i .ps1 come UTF-8 con BOM: in VS Code dalla codifica nella barra di stato, in Notepad++ dal menu della codifica con la voce UTF-8-BOM.
La console
Se solo la finestra della console mostra caratteri strani come ├¿ al posto di è, il file di solito è a posto: la console legge UTF-8 come code page DOS 437 (altro su questo schema). Cambia l'output con [Console]::OutputEncoding = [Text.Encoding]::UTF8. Per ciò che invii a programmi esterni, imposta anche $OutputEncoding = [Text.Encoding]::UTF8.
Se il file è già stato scritto rotto, trascinalo nel riquadro qui sopra: Mojibuster ripara è e simili e converte i file ANSI in UTF-8. Se il file contiene già punti interrogativi, il testo è perso; vedi punti interrogativi al posto degli accenti.
Domande frequenti
Che versione di PowerShell ho?
$PSVersionTable.PSVersion te lo dice. La 5.1 è il Windows PowerShell integrato in Windows; dalla 7 si chiama solo PowerShell e usa UTF-8 per impostazione predefinita.
Perché Excel apre male il mio CSV creato con PowerShell?
PowerShell 7 scrive UTF-8 senza BOM, che Excel non riconosce. Usa -Encoding utf8BOM oppure salva il file con BOM in Mojibuster. Altro su Excel e caratteri strani.
Mi serve chcp 65001?
Solo per i programmi che seguono la code page della console. All'interno di PowerShell basta [Console]::OutputEncoding.