about_Character_Encoding

Descrizione breve

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 indica la codifica Unicode usata per i dati. Per altre informazioni, vedere la documentazione relativa al contrassegno dell'ordine dei byte.

In Windows PowerShell qualsiasi codifica Unicode, ad eccezione UTF7di , crea sempre una distinta base. Per impostazione predefinita utf8NoBOM PowerShell (v6 e versioni successive) per tutti gli output di testo.

Per una migliore compatibilità complessiva, evitare di usare le macchine virtuali nei file UTF-8. Le piattaforme Unix e le utilità unix-heritage usate anche nelle piattaforme Windows non supportano le macchine virtuali.

Analogamente, UTF7 è consigliabile evitare la codifica. 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 con 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 la distinta base, Windows PowerShell interpreta erroneamente lo script come codificato nella tabella codici "ANSI" legacy. Al contrario, i file che hanno la distinta base UTF-8 possono essere problematici su piattaforme simili a Unix. Molti strumenti Unix, ad catesempio , awksed, e alcuni editor, gedit ad esempio, non sanno come trattare la distinta base.

Codifica dei caratteri in Windows PowerShell

In PowerShell 5.1 il parametro Encoding 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 che corrisponde 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 Usa UTF-32 con l'ordine dei byte little-endian.
  • UTF7 Usa UTF-7.
  • UTF8 Usa UTF-8 (con BOM).

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

Nota

L'uso di qualsiasi codifica Unicode, ad eccezione UTF7di , crea sempre una distinta base.

Per i cmdlet che scrivono output nei file:

  • Out-File e gli operatori > di reindirizzamento e >> creano UTF-16LE, che differiscono in particolare da Set-Content e Add-Content.

  • New-ModuleManifest e Export-CliXml anche creare file UTF-16LE.

  • Quando il file di destinazione è vuoto o non esiste Set-Content e Add-Content usa la Default codifica. Default è la codifica specificata dalla tabella codici LEGACY ANSI delle impostazioni locali di sistema attiva.

  • Export-Csv crea Ascii file, ma usa una codifica diversa quando si usa il 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 Ascii codifica per impostazione predefinita.

  • Start-Transcript crea Utf8 file con una distinta base. 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. Usano 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 ha bom, Default viene usata la codifica ANSI. 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 una distinta base. In assenza di un BOM, usa la Utf8 codifica.

  • Start-Transcript -Append corrisponde alla codifica esistente dei file che includono una distinta base. In assenza di una distinta base, per impostazione predefinita viene predefinito la Ascii codifica. 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 una distinta base:

  • Get-Content e Import-PowerShellDataFile usa la Default codifica ANSI. 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: usa la codifica per per la tabella codici ANSI delle impostazioni cultura correnti. 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 byte order mark (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 è utf8NoBOM impostato su per tutti gli output.

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

A partire da PowerShell 7.4, è possibile usare il Ansi valore per il parametro Encoding 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 Out-File cmdlet . È quindi possibile impostare la codifica predefinita usando la $PSDefaultParameterValues variabile di preferenza, 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 influisce $OutputEncoding 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.

Vedi anche