Eu apenas pensei em mencionar algo aqui que eu tive que passar muito tempo experimentando antes de finalmente perceber o que estava acontecendo. Isso pode ser tão óbvio para todos aqui que eles nem se deram ao trabalho de mencioná-lo. Mas teria me ajudado se eles tivessem, então, nesse princípio ...!
NB: Estou usando o Jython especificamente, v 2.7, portanto, possivelmente isso pode não se aplicar ao CPython ...
NB2: as duas primeiras linhas do meu arquivo .py aqui são:
# -*- coding: utf-8 -*-
from __future__ import print_function
O mecanismo de construção de cadeia "%" (AKA "interpolation operator") também causa problemas ADICIONAIS ... Se a codificação padrão do "ambiente" for ASCII e você tentar fazer algo como
print( "bonjour, %s" % "fréd" ) # Call this "print A"
Você não terá dificuldade em executar no Eclipse ... Em uma CLI do Windows (janela do DOS), você encontrará que a codificação é a página de código 850 (meu sistema operacional Windows 7) ou algo semelhante, que pode manipular pelo menos caracteres acentuados europeus, por isso vou trabalhar.
print( u"bonjour, %s" % "fréd" ) # Call this "print B"
também irá funcionar.
Se, OTOH, você direcionar para um arquivo da CLI, a codificação stdout será None, que será padronizada como ASCII (no meu sistema operacional de qualquer maneira), que não poderá lidar com nenhuma das impressões acima ... (codificação temida erro).
Então, você pode pensar em redirecionar seu stdout usando
sys.stdout = codecs.getwriter('utf8')(sys.stdout)
e tente executar na tubulação da CLI para um arquivo ... Muito estranhamente, a impressão A acima funcionará ... Mas a impressão B acima gerará o erro de codificação! No entanto, o seguinte funcionará bem:
print( u"bonjour, " + "fréd" ) # Call this "print C"
A conclusão a que cheguei (provisoriamente) é que, se uma string especificada como Unicode usando o prefixo "u" for submetida ao mecanismo de% -handling, ela envolverá o uso da codificação de ambiente padrão, independentemente de se você configurou o stdout para redirecionar!
Como as pessoas lidam com isso é uma questão de escolha. Gostaria de receber um especialista em Unicode para dizer por que isso acontece, se de alguma forma eu entendi errado, qual a solução preferida para isso, se também se aplica ao CPython , se ocorre no Python 3, etc., etc.