Condividi tramite


about_Codifica_di_Caratteri

Breve descrizione

Descrive in che modo PowerShell usa la codifica dei caratteri per l'input e l'output dei dati stringa.

Descrizione lunga

Unicode è uno standard di codifica dei caratteri globale. Il sistema usa Unicode esclusivamente per la manipolazione di caratteri e stringhe. Per una descrizione dettagliata di tutti gli aspetti di Unicode, vedere Lo standard Unicode.

Windows supporta set di caratteri Unicode e tradizionali. I set di caratteri tradizionali, ad esempio le tabelle codici di Windows, usano valori a 8 bit o combinazioni di valori a 8 bit per rappresentare i caratteri usati in una lingua o in un'area geografica specifica.

PowerShell usa un set di caratteri Unicode per impostazione predefinita. Tuttavia, diversi cmdlet hanno un parametro Encoding che può specificare la codifica per un set di caratteri diverso. Questo parametro consente di scegliere la codifica dei caratteri specifica necessaria per l'interoperabilità con altri sistemi e applicazioni.

I cmdlet seguenti hanno il parametro Encoding:

  • Microsoft.PowerShell.Management
    • Add-Content
    • Get-Content
    • Set-Content
  • Microsoft.PowerShell.Utility
    • Export-Clixml
    • Export-Csv
    • Export-PSSession
    • Format-Hex
    • Import-Csv
    • Out-File
    • Select-String
    • Send-MailMessage

Byte order-mark

Il byte-order-mark (BOM) è una firma Unicode nei primi byte di un file o di un flusso di testo che indicano la codifica Unicode usata per i dati. Per ulteriori informazioni, vedere la documentazione ordine dei byte.

In Windows PowerShell qualsiasi codifica Unicode, ad eccezione di UTF7, crea sempre un BOM. Per impostazione predefinita, PowerShell (v6 e versioni successive) utilizza il valore utf8NoBOM per tutti gli output di testo.

Per la massima compatibilità complessiva, evitare di usare i BOM nei file UTF-8. Le piattaforme Unix e le utilità di origine Unix utilizzate anche nelle piattaforme Windows non supportano i BOMs (Byte Order Marks).

Analogamente, è consigliabile evitare la codifica UTF7. UTF-7 non è una codifica Unicode standard e viene scritta senza bom in tutte le versioni di PowerShell.

La creazione di script di PowerShell in una piattaforma simile a Unix o l'uso di un editor multipiattaforma in Windows, ad esempio Visual Studio Code, genera un file codificato usando UTF8NoBOM. Questi file funzionano correttamente in PowerShell, ma possono interrompersi in Windows PowerShell se il file contiene caratteri non Ascii.

Se è necessario usare caratteri non Ascii negli script, salvarli come UTF-8 con BOM. Senza il BOM, Windows PowerShell interpreta in modo errato lo script come codificato nella pagina codice "ANSI" legacy. Al contrario, i file che hanno il BOM UTF-8 possono essere problematici su piattaforme simili a Unix. Molti strumenti Unix, come cat, sed, awke alcuni editor come gedit, non sanno come gestire il BOM.

Codifica dei caratteri in Windows PowerShell

In PowerShell 5.1 il parametro codifica supporta i valori seguenti:

  • Ascii usa il set di caratteri Ascii (a 7 bit).
  • BigEndianUnicode usa UTF-16 con l'ordine dei byte "big-endian".
  • BigEndianUTF32 usa UTF-32 con l'ordine dei byte big-endian.
  • Byte Codifica un set di caratteri in una sequenza di byte.
  • Default Usa la codifica corrispondente alla tabella codici attiva del sistema (in genere ANSI).
  • Oem Usa la codifica corrispondente alla tabella codici OEM corrente del sistema.
  • String Uguale a Unicode.
  • Unicode usa UTF-16 con l'ordine dei byte little-endian.
  • Unknown Uguale a Unicode.
  • UTF32 utilizza UTF-32 con l'ordine dei byte in formato little-endian.
  • UTF7 usa UTF-7.
  • UTF8 usa UTF-8 (con BOM).

In generale, Windows PowerShell usa la codifica unicode UTF-16LE per impostazione predefinita. Tuttavia, la codifica predefinita usata dai cmdlet in Windows PowerShell non è coerente.

Nota

Utilizzando qualsiasi codifica Unicode, ad eccezione di UTF7, si crea sempre un BOM.

Per i cmdlet che scrivono output nei file:

  • Out-File e gli operatori di reindirizzamento > e >> creano UTF-16LE, che si distinguono notevolmente da Set-Content e Add-Content.

  • New-ModuleManifest e Export-Clixml creano anche file UTF-16LE.

  • Quando il file di destinazione è vuoto o non esiste, Set-Content e Add-Content usare la codifica Default. Default è la codifica specificata dalla pagina codice di compatibilità ANSI della località attiva del sistema.

  • Export-Csv crea file Ascii ma usa una codifica diversa quando si usa parametro Append (vedere di seguito).

  • Export-PSSession crea file UTF-8 con BOM per impostazione predefinita.

  • New-Item -Type File -Value crea un file UTF-8 senza BOM.

  • Send-MailMessage usa la codifica Ascii per impostazione predefinita.

  • Start-Transcript crea file Utf8 con un BOM. Quando si usa il parametro append , la codifica può essere diversa (vedere di seguito).

Per i comandi che aggiungono a un file esistente:

  • Out-File -Append e l'operatore di reindirizzamento >> non tentano di corrispondere alla codifica del contenuto del file di destinazione esistente. Utilizzano invece la codifica predefinita, a meno che non venga usato il parametro encoding . È necessario usare la codifica originale dei file durante l'aggiunta di contenuto.

  • In assenza di un parametro Encoding esplicito, Add-Content rileva la codifica esistente e la applica automaticamente al nuovo contenuto. Se il contenuto esistente non dispone di BOM, viene utilizzata la codifica ANSI Default. Il comportamento di Add-Content è lo stesso in PowerShell (v6 e versioni successive), ad eccezione della codifica predefinita è Utf8.

  • Export-Csv -Append corrisponde alla codifica esistente quando il file di destinazione contiene un BOM. In assenza di un Byte Order Mark, usa la codifica Utf8.

  • Start-Transcript -Append corrisponde alla codifica esistente dei file che includono un BOM (Byte Order Mark). In assenza di un BOM, per impostazione predefinita viene codificato in Ascii. Questa codifica può comportare la perdita di dati o il danneggiamento dei caratteri quando i dati nella trascrizione contengono caratteri multibyte.

Per i cmdlet che leggono dati stringa in assenza di un BOM:

  • Get-Content e Import-PowerShellDataFile usa la codifica ANSI Default. ANSI è anche ciò che il motore di PowerShell usa quando legge il codice sorgente dai file.

  • Import-Csv, Import-Clixmle Select-String presuppongono Utf8 in assenza di una distinta base.

Codifica dei caratteri in PowerShell

In PowerShell (v7.1 e versioni successive), il parametro Encoding supporta i valori seguenti:

  • ascii: usa la codifica per il set di caratteri ASCII (a 7 bit).
  • ansi: Utilizza la codifica per la pagina codici ANSI della cultura attuale. Questa opzione è stata aggiunta in PowerShell 7.4.
  • bigendianunicode: codifica in formato UTF-16 usando l'ordine dei byte big-endian.
  • bigendianutf32: codifica in formato UTF-32 usando l'ordine dei byte big-endian.
  • oem: usa la codifica predefinita per i programmi MS-DOS e console.
  • unicode: codifica in formato UTF-16 usando l'ordine dei byte little-endian.
  • utf7: codifica in formato UTF-7.
  • utf8: Codifica in formato UTF-8 (nessun BOM).
  • utf8BOM: codifica in formato UTF-8 con marca d'ordine dei byte (BOM)
  • utf8NoBOM: Codifica in formato UTF-8 senza Byte Order Mark (BOM)
  • utf32: codifica in formato UTF-32 usando l'ordine dei byte little-endian.

Per impostazione predefinita, PowerShell imposta utf8NoBOM per tutti gli output.

A partire da PowerShell 6.2, il parametro Encoding consente anche ID numerici di tabelle codici registrate (ad esempio -Encoding 1251) o nomi di stringhe di tabelle codici registrate (ad esempio -Encoding "windows-1251"). Per altre informazioni, vedere la documentazione di .NET per Encoding.CodePage.

A partire da PowerShell 7.4, è possibile usare il valore per il parametro Codifica per passare l'ID numerico per la tabella codici ANSI delle impostazioni cultura correnti senza doverlo specificare manualmente.

Modifica della codifica predefinita

PowerShell include due variabili predefinite che possono essere usate per modificare il comportamento di codifica predefinito.

  • $PSDefaultParameterValues
  • $OutputEncoding

Per altre informazioni, vedere about_Preference_Variables.

A partire da PowerShell 5.1, gli operatori di reindirizzamento (> e >>) chiamano il cmdlet Out-File. È quindi possibile impostare la codifica predefinita usando la variabile di preferenza $PSDefaultParameterValues come illustrato in questo esempio:

$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'

Usare l'istruzione seguente per modificare la codifica predefinita per tutti i cmdlet con il parametro Encoding .

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

Importante

L'inserimento di questo comando nel profilo di PowerShell rende la preferenza un'impostazione globale di sessione che influisce su tutti i comandi e gli script che non specificano in modo esplicito una codifica.

Analogamente, è necessario includere tali comandi negli script o nei moduli che si vogliono comportare allo stesso modo. L'uso di questi comandi garantisce che i cmdlet si comportino allo stesso modo anche quando vengono eseguiti da un altro utente, in un computer diverso o in una versione diversa di PowerShell.

La variabile automatica $OutputEncoding influisce sulla codifica usata da PowerShell per comunicare con programmi esterni. Non ha alcun effetto sulla codifica usata dagli operatori di reindirizzamento di output e dai cmdlet di PowerShell per salvare i file.

Vedere anche