Lors de l'exécution de la console Python peut détecter l'encodage de la console et convertit implicitement Unicode imprimé à la console à ce codage. Il peut toujours échouer si ce codage ne prend pas en charge les caractères que vous essayez d'imprimer. UTF-8 peut prendre en charge tous les caractères Unicode, mais pas d'autres codages de console courants comme cp437 sur Windows US. Lorsque stdout n'est pas une console, Python 2.X utilise ASCII par défaut lorsqu'il ne peut pas déterminer un encodage de console.
C'est pourquoi dans un serveur Web, vous devez être explicite et encoder vous-même votre sortie.
À titre d'exemple, essayez le script suivant à partir d'une console et de votre serveur Web:
import sys
print sys.stdout.encoding
A partir de la console, vous devriez obtenir un codage, mais à partir du serveur Web, vous devez obtenir None
. Notez que Python 2.X utilise ascii
mais Python 3.X utilise utf-8
lorsque le codage ne peut pas être déterminé.
Le problème peut également survenir sur une console lors de la redirection de la sortie. Ce script:
import sys
print >>sys.stderr,sys.stdout.encoding
print >>sys.stderr,sys.stderr.encoding
renvoie le message suivant lorsqu'il est exécuté directement contre la redirection stdout
:
C:\>test
cp437
cp437
C:\>test >out.txt
None
cp437
Remarque stderr
n'a pas été affectée car elle n'a pas été redirigé.
La variable d'environnement PYTHONIOENCODING
peut également être utilisée pour remplacer le codage stdout/stdin par défaut.
Vous n'avez pas expliqué pourquoi cela se produit ... – scythargon
La modification de l'encodage par défaut n'est pas recommandée. Il casse les bibliothèques qui dépendent de l'encodage par défaut. Ce n'est pas nécessaire dans tous les cas si vous remappez 'stdout' avec' codecs.getwriter'. –
Je suis d'accord avec Mark, je n'ai pas besoin et je ne veux pas la ligne sys.setdefaultencoding ('utf-8'). – DrSkippy