É 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-8
e 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.