Seite 1 von 1
Unciode Code String in Python Unicode
Verfasst: Sonntag 22. November 2009, 14:23
von antihack3r
Hallo Forum,
ich hab hier zwar schon oft mitgelesen, bis jetzt kam ich aber nicht dazu mich zu registrieren, doch jetzt wo ich mal eine Frage hab, brauch ich euer Wissen
Ich habe eine Script der per TCP Daten empfängt, jedoch ist ein Teil davon in Unicode? (bin mir nicht ganz sicher). Auf jeden Fall wird ein als '\x61\x00' dargestellt. So jetzt ist meine Frage wie bekomm ich diese zwei Byte in den Python 'unicode' typ konvertiert? Bin leider ein wenig ratlos.
Danke schonmal
~anti
Verfasst: Sonntag 22. November 2009, 14:36
von cofi
Was du empfaengst sind Bytes, _nicht_ Unicode, sondern allenfalls kodiertes Unicode, dh. UTF-{8,16,32}.
Um `unicode` zu bekommen musst du diese Bytes eben dekodieren, dh `input.decode(codec)`.
Verfasst: Sonntag 22. November 2009, 15:07
von Hyperion
Hier mal wieder der Hinweis aufs wiki:
http://wiki.python-forum.de/Von%20Umlau ... 0Encodings
Und auf die Folien von Leonidas (auch wenn er sie "nur" eingedeutscht hat, oder wie war das?

):
http://wiki.python-forum.de/User%20Grou ... folien.pdf
Verfasst: Sonntag 22. November 2009, 15:14
von antihack3r
Danke, decode hab ich jetzt hinbekommen.
Nur anders rum passt es nocht nicht ^^
Das ist nicht ganz das was ich möchte.
Verfasst: Sonntag 22. November 2009, 15:25
von Pekh
Da könnte dir unter Umständen deine Shell einen Streich spielen. Mein IPython verwendet z.B. aus irgendwelchen Gründen nicht das Systemweit eingestellte UTF-8.
Folgendes passiert:
Code: Alles auswählen
In [1]: str_ = "ä".decode("utf-8")
In [2]: str_
Out[2]: u'\xe4'
In [3]: str_.encode("utf-8")
Out[3]: '\xc3\xa4'
In [4]: u"ä".encode("utf-8")
Out[4]: '\xc3\x83\xc2\xa4'
Obwohl sie theoretisch identisch sein sollten, werden die unteren beiden unterschiedlich codiert.
Nachtrag: Vermutlich liegt es nicht an IPython, sondern am Interpreter selbst. In normalen Quelltexten setzt man das Coding-Tag. Was kann man einer Shell mitgeben?
Verfasst: Sonntag 22. November 2009, 15:25
von Hyperion
antihack3r hat geschrieben:
Nur anders rum passt es nocht nicht ^^
Das ist nicht ganz das was ich möchte.
Kann denn Deine Shell UTF-16 überhaupt darstellen?
Code: Alles auswählen
In [2]: s = u'a'.encode ('utf-16')
In [3]: repr(s)
Out[3]: "'\\xff\\xfea\\x00'"
In [4]: s.decode("utf-16")
Out[4]: u'a'
Scheint also doch zu gehen!
Verfasst: Sonntag 22. November 2009, 15:31
von antihack3r
Oh mensch warum benutzt ich zum testen immer noch die kaputte Python Shell.
Dies soll wohl die byteorder angeben oder wie?
Kann ich das schon bei encode angeben das ich es nicht will oder muss ich das manuell via [2:] wegmachen?
Verfasst: Sonntag 22. November 2009, 15:33
von HWK
Code: Alles auswählen
>>> '\x61\x00'.decode('utf-16')
u'a'
>>> '\xff\xfea\x00'.decode('utf-16')
u'a'
MfG
HWK
Verfasst: Sonntag 22. November 2009, 17:23
von Darii
antihack3r hat geschrieben:Oh mensch warum benutzt ich zum testen immer noch die kaputte Python Shell.
Dies soll wohl die byteorder angeben oder wie?
Kann ich das schon bei encode angeben das ich es nicht will oder muss ich das manuell via [2:] wegmachen?
macht keine byte-order-Markierung.
Verfasst: Dienstag 24. November 2009, 23:30
von Trundle
@Pekh: Das liegt schon an ipython. Python selbst macht es richtig, bpython sollte es auch richtig machen.
Edit: Wobei man es natürlich durchaus so sehen kann, dass da eher Python kaputt ist. bpython fügt einfach immer einen encoding-Header in den auszuführenden Quelltext ein.