Seite 1 von 1

BaseHTTPServer und utf-8 als response

Verfasst: Mittwoch 24. Mai 2006, 18:43
von Zilchinger
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

Re: BaseHTTPServer und utf-8 als response

Verfasst: Donnerstag 25. Mai 2006, 07:23
von BlackJack
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.

Verfasst: Donnerstag 25. Mai 2006, 12:26
von Zilchinger
Ich glaub jetzt hab ichs kappiert :)
Vielen Dank nochmal

Grüße,
Stefan