ich weiß, dass der Titel schlimmes ahnen lässt und das dieses Thema in unzähligen Threads behandelt wurde und alle Regulars hier sicherlich nerven wird, aber leider habe ich auch nach dem Studium von zig Tutorials und Dokus wohl einiges noch nicht abschließend kapiert.
Kurz etwas zum Problem: Ich bin dabei ein kleines CGI-Script zu schreiben, das auf meinem Uni-Webspace laufen soll. Auf der Maschine verrichtet ein Apache seinen Dienst und das ganze läuft auf einem RedHat System. Python liegt dort (nur) in Version 2.3 vor.
Nun habe ich dort leider massive Codierungsprobleme beim Auswerten und Speichern der Userdaten. Am Schluss soll es eine Ausgabe auf einer HTMl-Seite geben und die Daten sollen per minidom in ein XML-File geschrieben werden. So viel zum "eigentlichen" Problem.
So, ich habe nun mal versucht mich der Sache einfach per Shell zu nähern und einfach mal verschiedene Sachen auszuprobieren, vor allem Dinge aus dem umfangreichen Tutorial http://www.python-forum.de/viewtopic.php?p=30572#30572, welches hier gerne als Hilfe angegeben wird.
Im folgenden mal die Auszüge aus der Python-Shell auf dem Uni-Rechner.
Code: Alles auswählen
>>> s = "Österreich"
>>> print s
Österreich

Code: Alles auswählen
>>> s.decode("ascii")
Traceback (most recent call last):
File "<stdin>", line 1, in ?
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
Code: Alles auswählen
>>> sys.getdefaultencoding()
'ascii'
Aber wie kann ich dann überhaupt ein "Österreich" eintippen?
Ok, dann habe ich mal folgendes gemacht:
Code: Alles auswählen
>>> s.decode("utf-8")
u'\xd6sterreich'
Code: Alles auswählen
>>> s.decode("utf-8").encode("utf-8")
'\xc3\x96sterreich'
Und das geht auch nicht!
Code: Alles auswählen
>>> s.decode("utf-8").encode("ascii")
Traceback (most recent call last):
File "<stdin>", line 1, in ?
UnicodeEncodeError: 'ascii' codec can't encode character u'\xd6' in position 0: ordinal not in range(128)
Code: Alles auswählen
>>> sys.getfilesystemencoding()
'UTF-8'
Ich habe also mal folgendes kleine Script geschrieben, um ein paar Sachen zu testen:
Code: Alles auswählen
import sys
print "default:",sys.getdefaultencoding()
print "filesystem:",sys.getfilesystemencoding()
print
print "Parameter:",sys.argv[1]
try:
print "von utf-8",sys.argv[1].decode("utf-8")
except Exception, e:
print e
try:
print "von ascii",sys.argv[1].decode("ascii")
except Exception, e:
print e
try:
print "von iso-8859-15",sys.argv[1].decode("iso-8859-15")
except Exception, e:
print e
Code: Alles auswählen
as:> python parameter.py ä
default: ascii
filesystem: UTF-8
Parameter: ä
von utf-8 ä
von ascii 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
von iso-8859-15 À
Hier mal der Auszug von der Stelle, an der der fehler auftritt:
(doc ist das xml-Dokument per minidom erstellt)
Code: Alles auswählen
try:
tmp = doc.toxml()
print tmp
#f = codecs.open(file,"w","utf-8")
#f.write(tmp)
#f.close()
except Exception, e:
drawError("Fehler beim Speichern der aktuellen Sprüche",e)
sys.exit(1)
Code: Alles auswählen
'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)
Ich bin irgend wie mit meinem Latein am Ende!