Saltar al contenido

Cambiar la codificación de salida predeterminada de PowerShell a UTF-8

Revisamos profundamente cada una de las noticias en nuestra web con la meta de enseñarte siempre información con la mayor veracidad y certera.

Solución:

Nota: Lo siguiente se aplica a Windows PowerShell.
Ver el Siguiente sección para la multiplataforma Potencia Shell Centro (v6 +) edición.

  • Sobre PSv5.1 o superior, dónde > y >> son efectivamente alias de Out-File, usted puede establecer la codificación predeterminada para > / >> / Out-File mediante el $PSDefaultParameterValues variable de preferencia:

    • $PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'
  • Sobre PSv5.0 o inferior, usted no poder cambiar la codificación para > / >>, pero, en PSv3 o superior, la técnica anterior lo hace trabajar para llamadas explícitas a Out-File.
    (Los $PSDefaultParameterValues La variable de preferencia se introdujo en PSv3.0).

  • Sobre PSv3.0 o superior, si quieres establecer la codificación predeterminada para todos cmdlets que admiten
    un -Encoding parámetro
    (que en PSv5.1 + incluye > y >>), usar:

    • $PSDefaultParameterValues['*:Encoding'] = 'utf8'

Si coloca este comando en su $PROFILE, cmdlets como como Out-File y Set-Content utilizará la codificación UTF-8 de forma predeterminada, pero tenga en cuenta que esto la convierte en una configuración de sesión-global que afectará a todos los comandos / scripts que no especifican explícitamente una codificación a través de su -Encoding parámetro.

Similar, asegúrese de incluir dichos comandos en su guiones o modulos que quieres comportarte de la misma manera, para que se comporten de la misma manera incluso cuando los ejecute otro usuario o una máquina diferente; sin embargo, para evitar una sesión-global cambiar, utilice el siguiente formulario para crear un local copia de $PSDefaultParameterValues:

  • $PSDefaultParameterValues = @ '*:Encoding' = 'utf8'

Consideración: PowerShell, a partir de v5.1, invariablemente crea archivos UTF-8 _con una (pseudo) lista de materiales_, que es habitual solo en el Ventanas mundo – Unixlas empresas de servicios públicos no reconocen esta lista de materiales (consulte la parte inferior); consulte esta publicación para conocer las soluciones que crean archivos UTF-8 sin BOM.

Para resumen del comportamiento de codificación de caracteres predeterminado tremendamente inconsistente en muchos de los cmdlets estándar de Windows PowerShell, consulte la sección inferior.


El automatico $OutputEncoding variable es no relacionadoy solo se aplica a la forma en que PowerShell se comunica con programas externos (qué codificación usa PowerShell cuando les envía cadenas): no tiene nada que ver con la codificación que usan los operadores de redirección de salida y los cmdlets de PowerShell para guardar en archivos.


Lectura opcional: la perspectiva multiplataforma: PowerShell Centro:

PowerShell ahora es multiplataforma, a través de su Potencia Shell Centro edición, cuya codificación – sensiblemente – predeterminado a UTF-8 sin BOM, en línea con las plataformas similares a Unix.

  • Esto significa que se supone que los archivos de código fuente sin una lista de materiales son UTF-8 y > / Out-File / Set-Content predeterminado a Sin lista de materiales UTF-8; uso explícito de la utf8-Encoding el argumento también crea Sin lista de materiales UTF-8, pero puede optar por crear archivos con la pseudo-lista de materiales con el utf8bom valor.

  • Si crea scripts de PowerShell con un editor en una plataforma similar a Unix y hoy en día incluso en Ventanas con editores multiplataforma como Visual Studio Code y Sublime Text, el resultado *.ps1 el archivo normalmente no tener una pseudo-BOM UTF-8:

    • Esto funciona bien en PowerShell Centro.
    • Puede romperse Windows PowerShell, si el archivo contiene caracteres que no son ASCII; si necesita utilizar caracteres que no sean ASCII en sus scripts, guárdelos como UTF-8 con BOM.
      Sin la lista de materiales, Windows PowerShell (mis) interpreta su secuencia de comandos como codificada en la página de códigos “ANSI” heredada (determinada por la configuración regional del sistema para las aplicaciones anteriores a Unicode; por ejemplo, Windows-1252 en sistemas en inglés de EE. UU.).
  • Por el contrario, archivos que hacer tener la pseudo-BOM UTF-8 puede ser problemático en plataformas similares a Unix, ya que provocan utilidades de Unix como cat, sed, y awk – e incluso algunos editores como gedit – para pasar la pseudo-lista de materiales a través de, es decir, tratarlo como datos.

    • Esto puede no siempre ser un problema, pero definitivamente puede serlo, como cuando intenta leer un archivo en un string en bash con, digamos, text=$(cat file) o text=$( - la variable resultante contendrá la pseudo-BOM como los primeros 3 bytes.

Comportamiento de codificación predeterminado inconsistente en Windows PowerShell:

Lamentablemente, la codificación de caracteres predeterminada utilizada en Windows PowerShell es tremendamente inconsistente; el PowerShell multiplataforma Centro edición, como se discutió en la sección anterior, ha puesto fin de manera encomiable a esto.

Nota:

  • Lo siguiente no aspira a cubrir todos cmdlets estándar.

  • Buscar en Google nombres de cmdlet para encontrar sus temas de ayuda ahora le muestra PowerShell Centro versión de los temas por defecto; utilice la lista desplegable de versiones sobre la lista de temas a la izquierda para cambiar a una Windows PowerShell versión.

  • En el momento de escribir este artículo, la documentación afirma con frecuencia incorrectamente que ASCII es la codificación predeterminada en Windows PowerShell; consulte este problema de documentos de GitHub.


Cmdlets que escribir:

Out-File y > / >> crear "Unicode" - UTF-16LE - archivos por defecto - en los que cada carácter de rango ASCII (también) está representado por 2 bytes, que se diferencia notablemente de Set-Content / Add-Content (ver el siguiente punto); New-ModuleManifest y Export-CliXml también crea archivos UTF-16LE.

Set-Content (y Add-Content si el archivo aún no existe / está vacío) usa codificación ANSI (la codificación especificada por la página de códigos heredados ANSI de la configuración regional activa, que PowerShell llama Default).

Export-Csv de hecho crea archivos ASCII, como se documenta, pero vea las notas sobre -Append debajo.

Export-PSSession crea archivos UTF-8 con BOM de forma predeterminada.

New-Item -Type File -Value actualmente crea UTF-8 sin lista de materiales (!).

los Send-MailMessage El tema de ayuda también afirma que la codificación ASCII es la predeterminada; no he verificado personalmente esa afirmación.

Start-Transcriptinvariablemente crea archivos UTF-8 con BOM, pero vea las notas sobre -Append debajo.

Re ordena que adjuntar a un archivo existente:

>> / Out-File -Append hacer no intentar hacer coincidir la codificación de un archivo contenido existente. Es decir, aplican ciegamente su codificación predeterminada, a menos que se les indique lo contrario con -Encoding, que no es una opción con >> (excepto indirectamente en PSv5.1 +, a través de $PSDefaultParameterValues, como se muestra arriba). En resumen: debe conocer la codificación del contenido de un archivo existente y agregar usando esa misma codificación.

Add-Content es la loable excepción: en ausencia de una -Encoding argumento, detecta la codificación existente y la aplica automáticamente al nuevo contenido.Gracias, js2010. Tenga en cuenta que en Windows PowerShell esto significa que la codificación ANSI se aplica si el contenido existente no tiene BOM, mientras que en PowerShell Core es UTF-8.

Esta inconsistencia entre Out-File -Append / >> y Add-Content, que también afecta a PowerShell Centro, se analiza en este número de GitHub.

Export-Csv -Appendparcialmente coincide con la codificación existente: agrega ciegamente UTF-8 si la codificación del archivo existente es ASCII / UTF-8 / ANSI, pero coincide correctamente con UTF-16LE y UTF-16BE.
Para decirlo de otra manera: en ausencia de una lista de materiales, Export-Csv -Append asume que UTF-8 es, mientras que Add-Content asume ANSI.

Start-Transcript -Appendparcialmente coincide con la codificación existente: coincide correctamente con las codificaciones con BOM, pero el valor predeterminado es la codificación ASCII potencialmente con pérdida en ausencia de una.


Cmdlets que leer (es decir, la codificación utilizada en el ausencia de una lista de materiales):

Get-Content y Import-PowerShellDataFile predeterminado a ANSI (Default), que es consistente con Set-Content.
ANSI es también lo que el motor PowerShell en sí mismo utiliza de forma predeterminada cuando lee código fuente de archivos.

Por el contrario, Import-Csv, Import-CliXml y Select-String asumir UTF-8 en ausencia de una lista de materiales.

No se te olvide dar recomendación a esta noticia si lograste el éxito.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *