BaseHTTPServer und utf-8 als response

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Zilchinger
User
Beiträge: 10
Registriert: Dienstag 18. April 2006, 00:01

Mittwoch 24. Mai 2006, 18:43

Hallo liebe Kollegen,
heute hab ich mich mit dem Thema utf-8 in Python beschäftigt.
Ich glaube ich habe soviel gelesen, das ich jetzt den Wald vor lauter Codepagen, encodes und decodes nicht mehr sehe!!!! :o

Ich habe eigentlich ein recht einfaches Problem:
Ich habe mir einen eigenen HTTPRequestHandler geschrieben, der von BaseHTTPRequestHandler erbt. Dort habe ich dann die Methode do_GET() implementiert:

Code: Alles auswählen

......
elif command == "/getlist":
            self.send_response(200)
            xml = self.__agent.getOwnMusicList()  #XML-String beschaffen
            self.send_header('Content-type','text/xml')
            self.send_header('Content-Length',len(str(xml))) #Contentlength da HTTP 1.1
            self.end_headers() #header abschliessen
            self.wfile.write(xml);   # xml-String als response senden!
......
In der letzten Zeile schicke ich quasi den XML-String als Response zurück!

Meine Frage ist nun: In welcher Codierung werden die Zeichen nun geschickt? Ich denke doch mal in ASCII. Das will ich jedoch nicht, denn ich möchte utf-8 als Zeichensatzt. Wandle ich jetzt den string in utf-8 um, dann knallts in der socket.py weil dort in einer Methode str(data) aufgerufen wird. data ist jetzt aber utf-8!!! Bum...

Ich glaub ich sehe nix mehr, kann mir jemand weiterhelfen? Wäre echt net :wink:

Viele Grüße,
Stefan
BlackJack

Donnerstag 25. Mai 2006, 07:23

Zilchinger hat geschrieben:

Code: Alles auswählen

......
elif command == "/getlist":
            self.send_response(200)
            xml = self.__agent.getOwnMusicList()  #XML-String beschaffen
            self.send_header('Content-type','text/xml')
            self.send_header('Content-Length',len(str(xml))) #Contentlength da HTTP 1.1
            self.end_headers() #header abschliessen
            self.wfile.write(xml);   # xml-String als response senden!
......
In der letzten Zeile schicke ich quasi den XML-String als Response zurück!

Meine Frage ist nun: In welcher Codierung werden die Zeichen nun geschickt?
In der Kodierung in der Dir `getOwnMusic()` die XML Zeichenkette liefert.
Ich denke doch mal in ASCII. Das will ich jedoch nicht, denn ich möchte utf-8 als Zeichensatzt.
Warum?
Wandle ich jetzt den string in utf-8 um, dann knallts in der socket.py weil dort in einer Methode str(data) aufgerufen wird. data ist jetzt aber utf-8!!! Bum...
Das kann nicht sein. Sockets ist es völlig egal in welcher Kodierung die Daten vorliegen. Das sind halt irgendwelche Bytes. Kann es sein, dass Du hier Unicode und UTF-8 verwechselst? Hast Du Deine Daten wirklich in UTF-8 kodiert, oder nur eine Unicode-Zeichenkette daraus gemacht?

Ausserdem solltest Du darauf achten, das Kodierung und die Angabe in der ersten XML-Zeile auch zusammenpassen. Wenn Du also Dein XML in UTF-8 kodierst und im XML selbst ISO-8859-1 steht, dann gibt's Murks weil der Empfänger versucht das UTF-8 als ISO-8859-1 zu dekodieren.
Zilchinger
User
Beiträge: 10
Registriert: Dienstag 18. April 2006, 00:01

Donnerstag 25. Mai 2006, 12:26

Ich glaub jetzt hab ichs kappiert :)
Vielen Dank nochmal

Grüße,
Stefan
Antworten