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 UTF7
di , 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 cat
esempio , awk
sed
, 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 aUnicode
.Unicode
Usa UTF-16 con l'ordine dei byte little-endian.Unknown
è uguale aUnicode
.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 UTF7
di , 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 daSet-Content
eAdd-Content
.New-ModuleManifest
eExport-CliXml
anche creare file UTF-16LE.Quando il file di destinazione è vuoto o non esiste
Set-Content
eAdd-Content
usa laDefault
codifica.Default
è la codifica specificata dalla tabella codici LEGACY ANSI delle impostazioni locali di sistema attiva.Export-Csv
creaAscii
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 laAscii
codifica per impostazione predefinita.Start-Transcript
creaUtf8
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 diAdd-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 laUtf8
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 laAscii
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
eImport-PowerShellDataFile
usa laDefault
codifica ANSI. ANSI è anche ciò che il motore di PowerShell usa quando legge il codice sorgente dai file.Import-Csv
,Import-CliXml
eSelect-String
presuppongonoUtf8
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.