Qual é a diferença no redirecionamento e codificação de texto do Windows CMD e do PowerShell?

Qual é a diferença no redirecionamento e codificação de texto do Windows CMD e do PowerShell?

É verdade que este não é um ótimo título, mas, para ser honesto, eu não tinha certeza de como formular a pergunta sem postar um ensaio como pergunta. Esta descrição deve acrescentar um pouco de carne.

Problema:

Eu tenho um script Python (não escrito por mim) que executo no Windows usando Python 2.7. Isso é relativamente básico e extrai informações de várias fontes e imprime a saída no terminal. Parte dessa saída usa caracteres em um conjunto de caracteres não-ASCII, e foi aí que a diversão começou.

Embora o script Python tenha funcionado bem na impressão do terminal na tela, assim que adicionei um redirecionamento de arquivo, recebi um erro e o script Python travou. Depois de MUITA pesquisa, isso pareceu se resumir à maneira como o Python 2.7 lida com Unicode, e resolvi isso definindo uma variável de ambiente do Windows para Python. Isto foi:

$env:PYTHONIOENCODING="UTF-8"

no PowerShell e

Set PYTHONIOENCODING="UTF-8"

no DMC.

OK, agora a saída do script Python pode ser redirecionada para um arquivo sem travar. O problema é que os dois ambientes dão resultados diferentes. O formato básico para executar o script Python é:

python pythonscript.py parm1 > test.txt

Embora isso funcione tanto no CMD quanto no PowerShell, acabo com um arquivo com codificações e caracteres diferentes. Por exemplo, um personagem que causa problemas é ø. Se eu executar a linha acima no CMD, o arquivo resultante será codificado UTF-8e mostrará corretamente esse caractere. No PowerShell, executar o mesmo comando resulta em um arquivo codificado como UCS-2 LE BOM(conforme mostrado no NotePad++), e o caractere acima aparece como 2 caracteres ├©.

Ainda mais bizarro, se eu não redirecionar em nenhum dos ambientes (então, apenas PRINT no terminal), ambos mostrarão os caracteres incorretos.

Eu também tentei canalizar o PowerShell para o CmdLet do arquivo externo, então:

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

Isso resulta em um arquivo codificado como UTF-8-BOM, mas ainda assim aparecem os caracteres incorretos. Eu tentei diferentes tipos de codificação aqui e, embora tenha acabado com diferentes codificações de arquivo e caracteres diferentes, nada parece estar correto.

Também examinei a página de código de ambos os ambientes executando chcp. Em ambos os casos, isso retorna Active code page: 850. Tentei definir o PowerShell para uma página de código 65001(que é utf-8) e isso não fez diferença.

Então, estou completamente confuso.

informação relacionada