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, awky 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 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 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 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 use Default 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 crea Ascii 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 usa Ascii la codificación de forma predeterminada.

  • Start-Transcript crea Utf8 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 de Add-Content es el mismo en PowerShell (v6 y versiones posteriores), excepto 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 una lista de materiales, usa Utf8 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 es Ascii 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 y Import-PowerShellDataFile usa la Default 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-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 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.

Consulte también