Modifica della codifica di output predefinita di PowerShell su UTF-8

Per impostazione predefinita, quando si reindirizza l’output di un comando a un file o lo si canalizza in qualcos’altro in PowerShell, la codifica è UTF-16, che non è utile. Sto cercando di cambiarlo in UTF-8.

Può essere eseguito caso per caso sostituendo la syntax >foo.txt con | out-file foo.txt -encoding utf8 | out-file foo.txt -encoding utf8 ma questo è scomodo da ripetere ogni volta.

Il modo persistente di impostare le cose in PowerShell consiste nel metterle in \Users\me\Documents\WindowsPowerShell\profile.ps1 ; Ho verificato che questo file sia effettivamente eseguito all’avvio.

È stato detto che la codifica dell’output può essere impostata con $PSDefaultParameterValues = @{'Out-File:Encoding' = 'utf8'} ma l’ho provato e non ha avuto alcun effetto.

https://blogs.msdn.microsoft.com/powershell/2006/12/11/outputencoding-to-the-rescue/ che parla di $OutputEncoding sembra a prima vista come se dovesse essere rilevante, ma poi parla di output essere codificato in ASCII, che non è ciò che sta realmente accadendo.

Come si imposta PowerShell per utilizzare UTF-8?

  • Su PSv5.1 o versioni successive , dove > e >> sono effettivamente alias di Out-File , puoi impostare la codifica predefinita per > / >> / Out-File tramite la variabile di preferenza $PSDefaultParameterValues :

    • $PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'
  • Su PSv5.0 o versioni successive , non è ansible modificare la codifica per > / >> , ma, su PSv3 o superiore , la tecnica sopra descritta funziona per le chiamate a Out-File .
    (La variabile di preferenza $PSDefaultParameterValues stata introdotta in PSv3.0).

  • Su PSv3.0 o versioni successive , se si desidera impostare la codifica predefinita per tutti i cmdlet che supportano
    un parametro -Encoding (che in PSv5.1 + include > e >> ), utilizzare:

    • $PSDefaultParameterValues['*:Encoding'] = 'utf8'

Se si inserisce questo comando nel $PROFILE , i cmdlet come Out-File e Set-Content utilizzeranno la codifica UTF-8 per impostazione predefinita, ma si noti che ciò rende un’impostazione globale della sessione che influirà su tutti i comandi / script che non lo fanno specificare esplicitamente una codifica.

Allo stesso modo, assicurati di includere tali comandi nei tuoi script o moduli che vuoi comportarti nello stesso modo , in modo che si comportino allo stesso modo anche quando vengono eseguiti da un altro utente o da un altro computer.

Avvertenza : PowerShell, a partire dalla v5.1, crea invariabilmente file UTF-8 con una BOM (pseudo) , che è consuetudine solo nel mondo Windowsle utilità basate su Unix non riconoscono questo BOM (vedi sotto).


La variabile $OutputEncoding automatica non è correlata e si applica solo a come PowerShell comunica con programmi esterni (quale codifica viene utilizzata da PowerShell quando invia stringhe) – non ha nulla a che fare con la codifica utilizzata dagli operatori di reindirizzamento dell’output e dai cmdlet di PowerShell per salvare in File.


Lettura opzionale: la prospettiva multipiattaforma:

PowerShell è ora multipiattaforma , tramite la sua edizione PowerShell Core , la cui codifica – sensibilmente – è impostata su BF-UTF-8 , in linea con le piattaforms di tipo Unix.

  • Ciò significa che i file del codice sorgente senza una BOM sono considerati UTF-8 e utilizzando i valori predefiniti di > / Out-File / Set-Content su UTF-8 senza distinta base ; anche l’uso esplicito dell’utice 8 -Encoding crea UTF-8 senza BOM-less , ma puoi scegliere di creare file con la pseudo-BOM con il valore utf8bom .

  • Se crei script PowerShell con un editor su una piattaforma simile a Unix e oggigiorno anche su Windows con editor multipiattaforma come Visual Studio Code e Sublime Text, il file *.ps1 risultante in genere non avrà una pseudo-BOM UTF-8 :

    • Funziona perfettamente con PowerShell Core .
    • Potrebbe interrompersi in Windows PowerShell , se il file contiene caratteri non ASCII; se è necessario utilizzare caratteri non ASCII negli script, salvarli come UTF-8 con BOM .
      Senza il BOM, Windows PowerShell interpreta erroneamente lo script come codificato nella legacy codifica “ANSI” (determinata dalle impostazioni internazionali del sistema per le applicazioni pre-Unicode, ad esempio Windows-1252 sui sistemi US-English).
  • Viceversa, i file che hanno la pseudo-BOM UTF-8 possono essere problematici su piattaforms Unix-like, poiché causano utilità Unix come cat , sed e awk – e persino alcuni editor come gedit – per passare la pseudo-BOM attraverso , cioè, trattarlo come dati .

    • Questo potrebbe non essere sempre un problema, ma sicuramente può esserlo, ad esempio quando si tenta di leggere un file in una stringa in bash con, ad esempio, text=$(cat file) o text=$( - la variabile risultante conterrà la pseudo-BOM come i primi 3 byte.