burli hat geschrieben:Nein, mein anfängliches Problem war, dass ich nicht erklären konnte, woher die Zeichen kamen. Wenn ich mit print den Text in der Konsole ausgebe werden die Sonderzeichen korrekt interpretiert. Mein derzeitiges Problem ist, dass ich nicht weiß von wem.
Interpretiert werden Zeichen immer von der darstellenden Umgebung; das kann ein Texteditor sein, eine Shell oder sonst was. Dein Problem liegt bei Python selber.
Zur Verdeutlichung:
Code: Alles auswählen
In [1]: import sys
In [2]: sys.getdefaultencoding()
Out[2]: 'ascii'
In [3]: sys.getfilesystemencoding()
Out[3]: 'UTF-8'
Ich benutze übrigens im Moment auch Ubuntu 10.10, also sollte es bei Dir analog aussehen. Das defaultencoding ist also "ascii". Python wird also immer versuchen, einen Unicode-String in einen Bytestring mit der Codierung ASCII umzuwandeln. Sobald Du ein Zeichen den möglichen Codierungsraum von ASCII übersteigt, bekommst Du die Exception.
So weit sollte es klar sein.
Nun kommt ein Verhalten, das mir im Moment auch nicht komplett einleuchtet.
Beim normalen print in eine Shell hinein, scheint Python das Filesystemencoding zu benutzen. In diesem Falle also utf-8, weswegen die Sonderzeichen ohne Probleme encodiert werden können.
Sobald Du eine Umleitung in eine Datei vornimmst, scheint Python das Defaultencoding zu benutzen, was dann in einem Fehler mündet.
Wieso Python das macht bzw. erkennen kann, ist mir im Moment auch schleierhaft!
Allerdings kannst Du das ja leicht umgehen, indem Du immer explizit bei IO-Operationen das Encoding angibst. Imho eh der beste Weg, weil Du Dich dann nicht an die "Willkür" des zugrunde liegenden OS bindest.
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
if __name__ == "__main__":
print sys.getdefaultencoding()
print u"Hallöle".encode("utf-8")