Com certeza, este não é um ótimo título, mas, para ser honesto, não sabia como redigir a pergunta sem postar um ensaio como a pergunta. Esta descrição deve adicionar um pouco de carne.
Eu tenho um script Python (não escrito por mim) que executo no Windows usando o Python 2.7. Isso é relativamente básico e extrai informações de várias fontes e IMPRIME a saída para o terminal. Parte dessa saída usa caracteres em um conjunto de caracteres não-ASCII, e é aí que a diversão começou.
Embora o script Python tenha sido executado corretamente na impressão do terminal na tela, assim que adicionei um redirecionamento de arquivo, recebi um erro e o script Python caiu. Depois de muita pesquisa, isso pareceu se resumir à maneira como o Python 2.7 manipula o Unicode, e eu trabalhei em torno disso definindo uma variável de ambiente do Windows para Python. Isso foi:
$env:PYTHONIOENCODING="UTF-8"
no PowerShell e
Set PYTHONIOENCODING="UTF-8"
no CMD.
OK, agora a saída do script Python pode ser redirecionada para um arquivo sem travar. O problema é que os dois ambientes fornecem resultados diferentes. O formato básico para executar o script Python é:
python pythonscript.py parm1 > test.txt
Embora isso funcione no CMD e no PowerShell, acabo com um arquivo com diferentes codificações e caracteres. Por exemplo, um personagem causando problemas é ø
. Se eu executar a linha acima no CMD, o arquivo resultante será codificado como UTF-8
e mostrará corretamente esse caractere. No PowerShell, a execução do mesmo comando resulta em um arquivo codificado como UCS-2 LE BOM
(como mostrado no NotePad ++), e o caractere acima, na verdade, é mostrado como 2 caracteres ├©
.
Ainda mais bizarramente, se eu não redirecionar em ambos os ambientes (assim, apenas PRINT para o terminal), ambos mostram os caracteres incorretos.
Eu também tentei no PowerShell canalizar o CmdLet de saída, então:
python pythonscript.py parm1 | out-file -encoding UTF8 test.txt
Isso resulta em um arquivo codificado como UTF-8-BOM
, mas os caracteres incorretos ainda aparecem. Eu tentei diferentes tipos de codificação aqui, e apesar de ter acabado com diferentes codificações de arquivos e diferentes caracteres, nada parece estar correto.
Também observei a página de códigos dos dois ambientes executando chcp
. Em ambos os casos, isso retorna Active code page: 850
. Eu tentei configurar o PowerShell em uma página de código de 65001
(que é utf-8
), e isso não fez diferença.
Então, estou completamente confuso.
Tags windows python utf-8 powershell cmd.exe