Seite 1 von 1
unicode problem
Verfasst: Montag 27. Juli 2009, 21:11
von INFACT
Wie kann ich das hier am besten mit python2.5 realisieren:
Da soll dann reuskommen:
Aber da kommt dann immer dieser error:
Code: Alles auswählen
Traceback (most recent call last):
File "<pyshell#22>", line 1, in <module>
"test€test".replace("test", u"ä")
UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position 4: ordinal not in range(128)
Das ist nur ein beispiel... aber wie bekomme ich das hin?

Verfasst: Montag 27. Juli 2009, 21:22
von cofi
Mit dem richtigen Encoding-Cookie am Anfang der Datei.
Verfasst: Montag 27. Juli 2009, 21:26
von INFACT
am anfang von einer normalen text datei?
Sry ich habe meinen beitrag editiert, das "test€test" stellt eine ausgesesene datei dar...
Verfasst: Montag 27. Juli 2009, 21:31
von cofi
Na dann solltest du diese Datei richtig decodieren und nicht einfach ``unicode`` anwenden.
Verfasst: Montag 27. Juli 2009, 21:41
von INFACT
Meinst du die datei so wie hier:
http://www.perl-community.de/bat/poard/thread/13591 - "wie geht das bei win?" oder soll ich statt unicode was anders benutzen?
Verfasst: Montag 27. Juli 2009, 21:45
von cofi
Du sollst die String-Methode ``decode(encoding)`` nutzen. Wir sind hier ausserdem nicht bei Perl. Vielleicht solltest du dir mal ein paar Texte ueber Unicode in Python anschauen? Z.B. Leonidas IMO sehr guten Vortrag oder auch das Material in der Dokumentation.
Alternativ kannst du auch ``codecs.open`` nutzen.
Verfasst: Dienstag 28. Juli 2009, 10:18
von INFACT
Ich verwende PyQt4 und habe dann das hier:
Code: Alles auswählen
str(self.beruf.text()).decode("iso-8859-1").encode(stdout_encoding)
Wenn in self.beruf.text() ein öäü oder so drin ist bekomme ich trotzdem einen Error:
Code: Alles auswählen
Traceback (most recent call last):
File "F:\#Fitnessline\main.py", line 175, in make_text
text = text.replace("[BERUF]", str(self.beruf.text()).decode("iso-8859-1").encode(stdout_encoding),1)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in position 1: ordinal not in range(128)
Obwohl das hier geht:
Code: Alles auswählen
>>> str("öüä").decode("iso-8859-1").encode(stdout_encoding)
'\xf6\xfc\xe4'
Kann mir bitte schnell jemand helfen?
Wenn ich utf-8 benutze kommt genau das gleiche...
Verfasst: Dienstag 28. Juli 2009, 12:00
von BlackJack
Was gibt denn `self.beruf.text()` für einen Typ zurück? Ich tippe mal auf `unicode` oder `QString`?
Du musst den Unterschied zwischen Bytes (`str`) und Zeichen verstehen lernen und Dir immer darüber im klaren sein, wass Du an welcher Stelle im Code hast.
Verfasst: Dienstag 28. Juli 2009, 12:05
von snafu
Qt hat die Methode
toUtf8(), die du auf den von `text()` zurückgelieferten QString (falls es einer ist) anwenden könntest.
Verfasst: Dienstag 28. Juli 2009, 12:29
von INFACT
Code: Alles auswählen
Traceback (most recent call last):
File "F:\#Fitnessline\Kopie von main.py", line 175, in make_text
text = text.replace("[BERUF]", unicode(self.beruf.text().toUtf8()),1)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)
Und auch wenn ich das unicode darum weglasse kommt der error...
Verfasst: Dienstag 28. Juli 2009, 12:42
von BlackJack
@INFACT: Du hast Unicode immer noch nicht verstanden. Mit `toUtf8()` bekommst Du UTF-8 kodierte Bytes. Das müsstest Du beim dekodieren in `unicode()` aber auch *angeben*. Woher soll Python sonst wissen *wie* es die Bytes dekodieren soll!?
Verfasst: Dienstag 28. Juli 2009, 13:15
von cofi
Verfasst: Dienstag 28. Juli 2009, 14:27
von lunar
Irgendwie komme ich da nicht ganz mit ... wo liegt den der Sinn, ein Objekt, dass bereits Unicode enthält, in Bytes zu verwandeln, und anschließend wieder zu Unicode zu dekodieren?
Wenn man ein Python-Unicode-Objekt benötigt, kann man auch einfach "unicode()" auf das QString-Objekt anwenden ...