Correggere la codifica dei caratteri in PowerShell

Il tuo script scrive è o ? al posto di è, o la console mostra testo strano? Windows PowerShell 5.1 usa una codifica diversa a seconda del comando. Ecco le cause e i parametri giusti; i file già rotti li ripari qui sopra, nel browser.

Funziona con testo e con questi file:

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

Per esempio esportazioni di Excel, backup di database, sottotitoli o codice di siti web.

Correggi

  1. Trascina un file o incolla il testo
  2. La correzione è automatica
  3. Copia o scarica
oppure trascina semplicemente un file qui
  • Nessun upload. I tuoi file vengono corretti direttamente nel browser e non lasciano mai il tuo dispositivo.

  • Server nell’UE. Mojibuster gira su un server in Finlandia (UE); si applica il Regolamento generale sulla protezione dei dati (GDPR). Testo del GDPR (EUR-Lex)

  • Per aziende e DPO: verifica tu stesso

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.

Un file UTF-8 letto con Get-Content in PowerShell 5.1

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 UTF8 legge correttamente i file UTF-8 anche senza BOM.
  • Set-Content, Out-File e Add-Content scrivono UTF-8 con -Encoding UTF8; nella 5.1 sempre con BOM.
  • Export-Csv dati.csv -Encoding UTF8 -NoTypeInformation al 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.

Altre guide