Compartir a través de


acerca_de_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 The Unicode Standard.

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 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 siguientes cmdlets incluyen el parámetro de 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 indica la codificación Unicode utilizada para los datos. Para obtener más información, consulte la documentación Marca de orden de bytes.

En Windows PowerShell, cualquier codificación Unicode, excepto UTF7, siempre crea un BOM. PowerShell (v6 y versiones posteriores) tiene como valor predeterminado utf8NoBOM para toda la salida de texto.

Para obtener la mejor compatibilidad general, evite el uso de BOM en archivos UTF-8. Las plataformas Unix y las utilidades derivadas de Unix, que también se usan en plataformas Windows, no admiten BOM.

Del mismo modo, se debe evitar la codificación UTF7. 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 BOM, Windows PowerShell interpreta erróneamente su secuencia de comandos como si estuviera codificada en la codificación "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 no saben cómo manejar el BOM.

Codificación de caracteres en Windows PowerShell

En PowerShell 5.1, el parámetro Codificación admite los valores siguientes:

  • Ascii Utiliza 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 que Unicode.
  • Unicode Usa UTF-16 con el orden de bytes little-endian.
  • Unknown igual que Unicode.
  • 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 utiliza la codificación Unicode UTF-16LE de forma predeterminada. Sin embargo, la codificación predeterminada que usan los cmdlets en Windows PowerShell no es coherente.

Nota

Usando cualquier codificación Unicode, excepto UTF7, siempre se genera un BOM.

Para cmdlets que escriben la salida en archivos:

  • Out-File y los operadores de redireccionamiento > y >> crean UTF-16LE, que se diferencia notablemente de Set-Content y Add-Content.

  • New-ModuleManifest y Export-Clixml también crean archivos UTF-16LE.

  • Cuando el archivo de destino está vacío o no existe, Set-Content y Add-Content usan codificación de Default. Default es la codificación especificada por la página de códigos heredada ANSI de la configuración regional activa del sistema.

  • Export-Csv crea archivos Ascii pero utiliza una codificación diferente cuando se utiliza el parámetro Append (consulte más abajo).

  • 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 usa la codificación Ascii de forma predeterminada.

  • Start-Transcript crea archivos Utf8 con una lista de materiales. Cuando se usa el parámetro Anexar, 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 de codificación. 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, se usa la codificación ANSI Default. El comportamiento de Add-Content es el mismo en PowerShell (v6 y versiones posteriores), excepto que la codificación predeterminada es Utf8.

  • Export-Csv -Append coincide con la codificación existente cuando el archivo de destino contiene una lista de materiales. En ausencia de un BOM, usa la codificación Utf8.

  • Start-Transcript -Append es compatible con la codificación existente de archivos que incluyen un BOM. En ausencia de un BOM, el valor predeterminado es la codificación Ascii. 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 y Import-PowerShellDataFile usan la codificación ANSI de Default. ANSI también es lo que usa el motor de PowerShell cuando lee el código fuente de los archivos.

  • Import-Csv, Import-Clixmly Select-String asumen Utf8 en ausencia de una lista de materiales.

Codificación de caracteres en PowerShell

En PowerShell (v7.1 y versiones posteriores), el parámetro Codificación admite los valores siguientes:

  • ascii: Usa la codificación para el conjunto de caracteres ASCII (7 bits).
  • ansi: utiliza la codificación para la página de códigos ANSI de la cultura actual. Esta opción se agregó en PowerShell 7.4.
  • bigendianunicode: codifica en formato UTF-16 utilizando el orden de bytes big-endian.
  • bigendianutf32: codifica en formato UTF-32 utilizando el orden de bytes big-endian.
  • oem: usa la codificación predeterminada para MS-DOS y programas de consola.
  • unicode: codifica en formato UTF-16 utilizando 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 utilizando el orden de bytes little-endian.

PowerShell tiene como valor predeterminado utf8NoBOM para todos los resultados.

A partir de PowerShell 6.2, el parámetro Codificación 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 valor ANSI para el parámetro Encoding y 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 cmdlet Out-File. Por lo tanto, puede establecer la codificación predeterminada de ellos mediante la variable de preferencia $PSDefaultParameterValues, 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 Codificación.

$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 que se comporten 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 automática $OutputEncoding 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.

Consulte también