Unciode Code String in Python Unicode

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
antihack3r
User
Beiträge: 3
Registriert: Sonntag 22. November 2009, 14:17

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
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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)`.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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
antihack3r
User
Beiträge: 3
Registriert: Sonntag 22. November 2009, 14:17

Danke, decode hab ich jetzt hinbekommen.

Code: Alles auswählen

>>> '\x61\x00'.decode ('utf-16')
u'a'
Nur anders rum passt es nocht nicht ^^

Code: Alles auswählen

u'a'.encode ('utf-16')
'\xff\xfea\x00'
Das ist nicht ganz das was ich möchte.
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

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?
Zuletzt geändert von Pekh am Sonntag 22. November 2009, 15:28, insgesamt 1-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

antihack3r hat geschrieben: Nur anders rum passt es nocht nicht ^^

Code: Alles auswählen

u'a'.encode ('utf-16')
'\xff\xfea\x00'
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!
antihack3r
User
Beiträge: 3
Registriert: Sonntag 22. November 2009, 14:17

Oh mensch warum benutzt ich zum testen immer noch die kaputte Python Shell.
Dies soll wohl die byteorder angeben oder wie?

Code: Alles auswählen

\xff\xfe
Kann ich das schon bei encode angeben das ich es nicht will oder muss ich das manuell via [2:] wegmachen?
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Code: Alles auswählen

>>> '\x61\x00'.decode('utf-16')
u'a'
>>> '\xff\xfea\x00'.decode('utf-16')
u'a'
MfG
HWK
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

antihack3r hat geschrieben:Oh mensch warum benutzt ich zum testen immer noch die kaputte Python Shell.
Dies soll wohl die byteorder angeben oder wie?

Code: Alles auswählen

\xff\xfe
Kann ich das schon bei encode angeben das ich es nicht will oder muss ich das manuell via [2:] wegmachen?

Code: Alles auswählen

"a".encode("utf-16-le") # bzw. utf-16-be
macht keine byte-order-Markierung.
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

@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.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
Antworten