Eine schöne Erklärung ist hier: https://code.djangoproject.com/ticket/5877#comment:5
Demnach ist es ja so: python nutzt für stdout das encoding von "LANG" oder "PYTHONENCODING"
Wenn alles modern und ok ist, ist es UTF-8 und im django management command kann man alles mit self.stdout.write() ausgeben. Am besten übergibt man dabei immer unicode und gut...
Doch man bekommt Probleme, wenn es kein UTF-8 ist.
Ich hab mal ein kleines Test Skript gemacht:
Code: Alles auswählen
#!/usr/bin/env python
# coding: utf-8
import os, sys
print "Encoding test"
print "LANG:", os.environ.get("LANG", "-")
print "PYTHONENCODING:", os.environ.get("PYTHONENCODING", "-")
print "sys.stdout.encoding:", sys.stdout.encoding
print "sys.getfilesystemencoding():", sys.getfilesystemencoding()
print u"test caf\u00E9!"
print "--END--"
Code: Alles auswählen
Encoding test
LANG: de_DE.UTF-8
PYTHONENCODING: -
sys.stdout.encoding: UTF-8
sys.getfilesystemencoding(): UTF-8
test café!
--END--
Code: Alles auswählen
Encoding test
LANG: de_DE
PYTHONENCODING: -
sys.stdout.encoding: ISO-8859-1
sys.getfilesystemencoding(): ISO-8859-1
test caf�!
--END--
Was sollte man also machen, damit man beim Aufruf eines django management command kein Fehler bekommt?
Wie wäre es smart_str() mit encoding=sys.stdout.encoding or sys.getfilesystemencoding() und errors="replace" zu nutzten? Wenn etwas nicht gezeigt werden kann, wird es ersetzt, aber das management command kann durchlaufen.