Encoding Probleme mit minidom
Verfasst: Freitag 21. September 2007, 13:04
Hallo zusammen,
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.
Na das klappt ja
Also bedeutet das, dass der Ursprungszeichensatz gar kein "ascii" war? Dies wäre eigentlich kein Problem, wenn ich nicht folgendes rausgefunden hätte:
Beduetet das nicht, dass diese Python-Instanz ascii-Kodierung verwendet?
Aber wie kann ich dann überhaupt ein "Österreich" eintippen?
Ok, dann habe ich mal folgendes gemacht:
Sieht nach Unicode aus, oder?
Wieso wandelt er nun das "\xd6" also das "Ö" nicht wieder in ein "Ö"?
Und das geht auch nicht!
Aber ascii soll doch angeblich der defaultencoding sein ... ich blicks einfach nicht (und ja, in ascii gibt es keine "ä","ö" usw ... daher bin ich noch verwirrter wie das alles zusammenhängt!)
Das besagt doch, dass die Parameter des OS in utf-8 übergeben werden, oder? Also sollten doch meine Texte aus dem CGI-Script und dem zugehörigen textarea als utf-8 übergeben werden, oder?
Ich habe also mal folgendes kleine Script geschrieben, um ein paar Sachen zu testen:
Hier die Ausgabe: (lokal erhalte ich sogar dieselbe)
Wenn ich das richtig begreife bekommt also Python den Übergabeparameter tatsächlich als utf-8. Wieso aber meckert dann mein Script, wenn es "ä", "ö" usw. erhält?
Hier mal der Auszug von der Stelle, an der der fehler auftritt:
(doc ist das xml-Dokument per minidom erstellt)
(Die Kommentare sind nur "Bastel"-Sachen, die ich mal auskommentiert habe. Der Fehler liegt also def. am toxml() von minidom!
Bekomme ich als Fehler, Eingabe war "ääööö"
Ich bin irgend wie mit meinem Latein am Ende!
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!