Hi Gerold,
jetzt muss ich dich schon wieder nerven.
Schade, ich dachte das Beispiel erklärt es recht gut. Zwei wichtige Aussagen wollte ich mit dem Beispiel erklären. Ich hätte vielleicht doch darauf hinweisen sollen. Wink Es fällt einem beim Schreiben nicht auf.
Du hast natürlich recht! Deine erste Antwort hätte mein Problem bereits gelöst. In meiner unendlichen Ignoranz hab ich mich darauf verlassen, dass meine Python Kenntnisse ausreichen um dein Sourcecode ohne ausprobieren zu verstehe und es wie du es so schön sagtest "rauslesen kann". Ich dachte das dein Beispiel den selben Fehler liefern würde, wenn ich es in eine Datei umleite.
Was mich wohl an der ganzen Sache so verwirrte, dass meine shell das ganze ohne den Umweg nach utf-8 korrekt ausgibt. Warum eigentlich? Versteht Bash von Haus aus Unicode? Oder wie macht es dann Python, dass ein Unicode String, der noch nicht nach utf-8 umgewandelt wurde korrekt auf der bash ausgibt? Deshalb bin ich davon ausgegangen, dass mein Codebeispiel bereits utf-8 explizit ausgibt und sich nichts an meinem Problem ändert durch deine Erklärung. Sorry nochmal für diese unglaublich dumme Behauptung.
Aber es hatte doch ein Gutes. Du hast gegoogelt und eine gute Idee zu tage gebracht.
Es hatte noch was gutes. Ich glaube ich habe es endlich halbwegs begriffen!!!
Vielleicht habe ich noch eine Ergänzung die du gebrauchen kannst.
Diese ganze Reise durch den Unicode Dschungel mache ich eigentlich, weil ich gerade mit pygoogle, einem wrapper für die google api experimentiere. pygoogle importiert unter anderem soapbuilder.py, welches das encoding mittels dem veraltetem sys.getdefaultencoding() ermittelt. (Wie ich gelesen habe soll diese Funktion in der nächsten Python Version rausfallen). Komischerweise ?? liefert diese funktion als Rückgabewert ("ASCII"), was dann natürlich zu Problemen führt.
Und so ändert man den Rückgabewert von sys.getdefaultencoding():
(was du wahrscheinlich als unicode-guru längst weißt)
Code: Alles auswählen
# sitecustomize.py 1
# this file can be anywhere in your Python path,
# but it usually goes in ${pythondir}/lib/site-packages/
import sys
sys.setdefaultencoding('utf-8')
dabei ist sitecustomize.py ein spezielles skript, dass beim starten von python importiert wird.
Dieses sys.setdefaultencoding(enc_string) funktioniert auch nur in diesem speziellen sitecustomize.py.
Wenn man sys mittels "import sys" in einem eigenen skript importiert ist setdefaultencoding(enc_string) nicht verfügbar.
Ist ganz nützlich, wenn man alte Bibliotheken hat, die sich bei Ermittlung der Kodierung auf sys.getdefaultencoding() verlassen und man dieselbige dann "zwingen" muss ein anderes defaultencoding zu verwenden.
Vielen Dank nochmal für deine Mühe und ausführliche Erklärung, die du dir eigentlich hättest sparen können, wenn ich mir deine erste Antwort nur genauer angeschaut hätte.
Gruß Felice