¿Cuál es la diferencia en la redirección y codificación de texto CMD de Windows y PowerShell?

¿Cuál es la diferencia en la redirección y codificación de texto CMD de Windows y PowerShell?

Por supuesto, este no es un gran título, pero para ser honesto, no estaba seguro de cómo formular la pregunta sin publicar un ensayo como pregunta. Esta descripción debería agregar algo de carne.

Problema:

Tengo un script de Python (no escrito por mí) que ejecuto en Windows usando Python 2.7. Esto es relativamente básico y extrae información de varias fuentes e IMPRIME la salida al terminal. Parte de esta salida utiliza caracteres en un conjunto de caracteres que no es ASCII, y aquí es donde comenzó la diversión.

Si bien el script de Python se ejecutó correctamente en la terminal imprimiendo en la pantalla, tan pronto como agregué una redirección de archivos, recibí un error y el script de Python falló. Después de MUCHA investigación, esto parecía reducirse a la forma en que Python 2.7 maneja Unicode, y lo solucioné configurando una variable de entorno de Windows para Python. Esto era:

$env:PYTHONIOENCODING="UTF-8"

en PowerShell y

Set PYTHONIOENCODING="UTF-8"

en CMD.

Bien, ahora la salida del script Python se puede redirigir a un archivo sin fallar. El problema es que los dos entornos dan resultados diferentes. El formato básico para ejecutar el script Python es:

python pythonscript.py parm1 > test.txt

Si bien esto funciona tanto en CMD como en PowerShell, termino con un archivo con diferentes codificaciones y caracteres. Por ejemplo, un personaje que causa problemas es ø. Si ejecuto la línea anterior en CMD, el archivo resultante se codifica UTF-8y muestra correctamente este carácter. En PowerShell, ejecutar el mismo comando da como resultado un archivo codificado como UCS-2 LE BOM(como se muestra en NotePad++), y el carácter anterior en realidad se muestra como 2 caracteres ├©.

Aún más extraño, si no redirijo en ninguno de los entornos (por lo tanto, simplemente IMPRIMIR en la terminal), ambos muestran los caracteres incorrectos.

También probé en PowerShell la conexión al archivo de salida CmdLet, así que:

python pythonscript.py parm1 | out-file -encoding UTF8 test.txt

Esto da como resultado un archivo codificado como UTF-8-BOM, pero aún aparecen los caracteres incorrectos. Probé diferentes tipos de codificación aquí y, aunque terminé con diferentes codificaciones de archivos y diferentes caracteres, nada parece ser correcto.

También miré la página de códigos de ambos entornos ejecutando chcp. En ambos casos esto regresa Active code page: 850. Intenté configurar PowerShell en una página de códigos de 65001(que es utf-8) y esto no hizo ninguna diferencia.

Así que estoy completamente confundido.

información relacionada