Como imprimir texto codificado em UTF-8 no console em Python <3?
Estou executando um sistema Linux recente, onde todas as minhas localidades são UTF-8:
LANG=de_DE.UTF-8
LANGUAGE=
LC_CTYPE="de_DE.UTF-8"
LC_NUMERIC="de_DE.UTF-8"
LC_TIME="de_DE.UTF-8"
...
LC_IDENTIFICATION="de_DE.UTF-8"
LC_ALL=
Agora quero escrever conteúdo codificado em UTF-8 para o console.
Agora, o Python usa o UTF-8 para a codificação do FS, mas adere ao ASCII para a codificação padrão :-(
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> sys.getfilesystemencoding()
'UTF-8'
Eu pensei que a melhor maneira (limpa) de fazer isso eraPYTHONIOENCODING
variável de ambiente. Mas parece que o Python o ignora. Pelo menos no meu sistema eu continuo recebendoascii
como codificação padrão, mesmo depois de definirenvvar.
# tried this in ~/.bashrc and ~/.profile (also sourced them)
# and on the commandline before running python
export PYTHONIOENCODING=UTF-8
Se eu fizer o seguinte no início de um script, ele funcionará:
>>> import sys
>>> reload(sys) # to enable `setdefaultencoding` again
<module 'sys' (built-in)>
>>> sys.setdefaultencoding("UTF-8")
>>> sys.getdefaultencoding()
'UTF-8'
Mas essa abordagemparece impuro. Então, o que é uma boa maneira de conseguir isso?
Solução alternativaEm vez de alterar a codificação padrão - que énão é uma boa ideia (veja a resposta do mesilliac) - eu apenas enroleisys.stdout
com umStreamWriter
como isso:
sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout)
Vejoesta essência para uma pequena função de utilidade, que lida com isso.