Acerca de la codificación de caracteres
Descripción breve
Describe cómo PowerShell usa la codificación de caracteres para la entrada y salida de datos de cadena.
Descripción larga
Unicode es un estándar de codificación de caracteres en todo el mundo. El sistema usa Unicode exclusivamente para la manipulación de caracteres y cadenas. Para obtener una descripción detallada de todos los aspectos de Unicode, consulte El estándar Unicode.
Windows admite unicode y juegos de caracteres tradicionales. Los juegos de caracteres tradicionales, como las páginas de códigos de Windows, usan valores de 8 bits o combinaciones de valores de 8 bits para representar los caracteres usados en una configuración de idioma o región geográfica específica.
PowerShell usa un juego de caracteres Unicode de forma predeterminada. Sin embargo, varios cmdlets tienen un parámetro de codificación que puede especificar la codificación para un conjunto de caracteres diferente. Este parámetro permite elegir el específico de la codificación de caracteres que necesita para la interoperabilidad con otros sistemas y aplicaciones.
Los cmdlets siguientes tienen el parámetro 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
Marca de orden de bytes
La marca de orden de bytes (BOM) es una firma Unicode en los primeros bytes de un archivo o flujo de texto que indican la codificación Unicode que se usa para los datos. Para obtener más información, consulte la documentación de la marca de orden de bytes.
En Windows PowerShell, cualquier codificación Unicode, excepto UTF7
, siempre crea una lista de materiales. PowerShell (v6 y versiones posteriores) tiene utf8NoBOM
como valor predeterminado para todas las salidas de texto.
Para obtener la mejor compatibilidad general, evite el uso de BOM en archivos UTF-8. Las plataformas Unix y las utilidades de herencia de Unix también se usan en plataformas Windows no admiten boms.
De forma similar, UTF7
se debe evitar la codificación. UTF-7 no es una codificación Unicode estándar y se escribe sin una boM en todas las versiones de PowerShell.
La creación de scripts de PowerShell en una plataforma similar a Unix o mediante un editor multiplataforma en Windows, como Visual Studio Code, da como resultado un archivo codificado mediante UTF8NoBOM
. Estos archivos funcionan bien en PowerShell, pero pueden interrumpirse en Windows PowerShell si el archivo contiene caracteres que no son Ascii.
Si necesita usar caracteres que no sean Ascii en los scripts, guárdelos como UTF-8 con BOM. Sin la lista de materiales, Windows PowerShell malinterprete el script como codificado en la página de códigos "ANSI" heredada. Por el contrario, los archivos que tienen la BOM UTF-8 pueden ser problemáticos en plataformas similares a Unix. Muchas herramientas de Unix, como cat
, sed
, awk
y algunos editores como gedit
, por ejemplo, no saben cómo tratar la lista de materiales.
Codificación de caracteres en Windows PowerShell
En PowerShell 5.1, el parámetro Encoding admite los siguientes valores:
Ascii
Usa el juego de caracteres Ascii (7 bits).BigEndianUnicode
Usa UTF-16 con el orden de bytes big-endian.BigEndianUTF32
Usa UTF-32 con el orden de bytes big-endian.Byte
Codifica un conjunto de caracteres en una secuencia de bytes.Default
Usa la codificación que corresponde a la página de códigos activa del sistema (normalmente ANSI).Oem
Usa la codificación que corresponde a la página de códigos oem actual del sistema.String
Igual queUnicode
.Unicode
Usa UTF-16 con el orden de bytes little-endian.Unknown
Igual queUnicode
.UTF32
Usa UTF-32 con el orden de bytes little-endian.UTF7
Usa UTF-7.UTF8
Usa UTF-8 (con BOM).
En general, Windows PowerShell usa la codificación UTF-16LE Unicode de forma predeterminada. Sin embargo, la codificación predeterminada que usan los cmdlets en Windows PowerShell no es coherente.
Nota:
Con cualquier codificación Unicode, excepto UTF7
, siempre crea una lista de materiales.
Para cmdlets que escriben la salida en archivos:
Out-File
y los operadores>
de redirección y>>
crean UTF-16LE, que en particular difieren deSet-Content
yAdd-Content
.New-ModuleManifest
yExport-CliXml
también crean archivos UTF-16LE.Cuando el archivo de destino está vacío o no existe,
Set-Content
yAdd-Content
useDefault
la codificación.Default
es la codificación especificada por la página de códigos heredada ANSI de la configuración regional del sistema activo.Export-Csv
creaAscii
archivos pero usa una codificación diferente al usar el parámetro Append (consulte a continuación).Export-PSSession
crea archivos UTF-8 con BOM de forma predeterminada.New-Item -Type File -Value
crea un archivo UTF-8 sin BOM.Send-MailMessage
usaAscii
la codificación de forma predeterminada.Start-Transcript
creaUtf8
archivos con una lista de materiales. Cuando se usa el parámetro Append , la codificación puede ser diferente (consulte a continuación).
Para los comandos que se anexan a un archivo existente:
Out-File -Append
y el>>
operador de redireccionamiento no intentan coincidir con la codificación del contenido del archivo de destino existente. En su lugar, usan la codificación predeterminada a menos que se use el parámetro Encoding . Debe usar la codificación original de los archivos al anexar contenido.En ausencia de un parámetro de codificación explícita,
Add-Content
detecta la codificación existente y la aplica automáticamente al nuevo contenido. Si el contenido existente no tiene boM,Default
se usa la codificación ANSI. El comportamiento deAdd-Content
es el mismo en PowerShell (v6 y versiones posteriores), excepto la codificación predeterminada esUtf8
.Export-Csv -Append
coincide con la codificación existente cuando el archivo de destino contiene una lista de materiales. En ausencia de una lista de materiales, usaUtf8
codificación.Start-Transcript -Append
coincide con la codificación existente de archivos que incluyen una lista de materiales. En ausencia de una lista de materiales, el valor predeterminado esAscii
la codificación. Esta codificación puede provocar pérdida de datos o daños en caracteres cuando los datos de la transcripción contienen caracteres multibyte.
Para cmdlets que leen datos de cadena en ausencia de una lista de materiales:
Get-Content
yImport-PowerShellDataFile
usa laDefault
codificación ANSI. ANSI también es lo que usa el motor de PowerShell cuando lee el código fuente de los archivos.Import-Csv
,Import-CliXml
ySelect-String
asumenUtf8
en ausencia de una lista de materiales.
Codificación de caracteres en PowerShell
En PowerShell (v7.1 y versiones posteriores), el parámetro Encoding admite los siguientes valores:
ascii
: usa la codificación para el juego de caracteres ASCII (7 bits).ansi
: usa la codificación para la página de códigos ANSI de la referencia cultural actual. Esta opción se agregó en PowerShell 7.4.bigendianunicode
: codifica en formato UTF-16 mediante el orden de bytes big-endian.bigendianutf32
: codifica en formato UTF-32 mediante el orden de bytes big-endian.oem
: usa la codificación predeterminada para los programas de consola y MS-DOS.unicode
: codifica en formato UTF-16 mediante el orden de bytes little-endian.utf7
: codifica en formato UTF-7.utf8
: codifica en formato UTF-8 (sin BOM).utf8BOM
: codifica en formato UTF-8 con marca de orden de bytes (BOM)utf8NoBOM
: codifica en formato UTF-8 sin marca de orden de bytes (BOM)utf32
: codifica en formato UTF-32 mediante el orden de bytes little-endian.
PowerShell tiene utf8NoBOM
como valor predeterminado para todas las salidas.
A partir de PowerShell 6.2, el parámetro Encoding también permite identificadores numéricos de páginas de códigos registradas (como -Encoding 1251
) o nombres de cadena de páginas de códigos registradas (como -Encoding "windows-1251"
). Para obtener más información, consulte la documentación de .NET para Encoding.CodePage.
A partir de PowerShell 7.4, puede usar el Ansi
valor del parámetro Encoding para pasar el identificador numérico de la página de códigos ANSI de la referencia cultural actual sin tener que especificarlo manualmente.
Cambio de la codificación predeterminada
PowerShell tiene dos variables predeterminadas que se pueden usar para cambiar el comportamiento de codificación predeterminado.
$PSDefaultParameterValues
$OutputEncoding
Para obtener más información, consulte about_Preference_Variables.
A partir de PowerShell 5.1, los operadores de redireccionamiento (>
y >>
) llaman al Out-File
cmdlet . Por lo tanto, puede establecer la codificación predeterminada de ellas mediante la $PSDefaultParameterValues
variable de preferencia, como se muestra en este ejemplo:
$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'
Use la siguiente instrucción para cambiar la codificación predeterminada para todos los cmdlets que tienen el parámetro Encoding .
$PSDefaultParameterValues['*:Encoding'] = 'utf8'
Importante
Al colocar este comando en el perfil de PowerShell, la preferencia es una configuración global de sesión que afecta a todos los comandos y scripts que no especifican explícitamente una codificación.
Del mismo modo, debe incluir estos comandos en los scripts o módulos que desea comportar de la misma manera. El uso de estos comandos garantiza que los cmdlets se comporten del mismo modo incluso cuando se ejecutan por otro usuario, en un equipo diferente o en una versión diferente de PowerShell.
La variable $OutputEncoding
automática afecta a la codificación que PowerShell usa para comunicarse con programas externos. No tiene ningún efecto en la codificación que usan los operadores de redirección de salida y los cmdlets de PowerShell para guardar en archivos.