unicode problem

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
INFACT
User
Beiträge: 385
Registriert: Freitag 5. Dezember 2008, 16:08

Wie kann ich das hier am besten mit python2.5 realisieren:

Code: Alles auswählen

unicode("test€test").replace("test", unicode("ä"))
Da soll dann reuskommen:

Code: Alles auswählen

"ä€ä"
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? :wink:
[b][i]ein kleines game für die die lust haben http://konaminut.mybrute.com[/i][/b]
;-)
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Mit dem richtigen Encoding-Cookie am Anfang der Datei.
INFACT
User
Beiträge: 385
Registriert: Freitag 5. Dezember 2008, 16:08

am anfang von einer normalen text datei?

Code: Alles auswählen

# -*- coding: iso-8859-15 -*-
Sry ich habe meinen beitrag editiert, das "test€test" stellt eine ausgesesene datei dar...
[b][i]ein kleines game für die die lust haben http://konaminut.mybrute.com[/i][/b]
;-)
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Na dann solltest du diese Datei richtig decodieren und nicht einfach ``unicode`` anwenden.
INFACT
User
Beiträge: 385
Registriert: Freitag 5. Dezember 2008, 16:08

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?
[b][i]ein kleines game für die die lust haben http://konaminut.mybrute.com[/i][/b]
;-)
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
INFACT
User
Beiträge: 385
Registriert: Freitag 5. Dezember 2008, 16:08

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...
[b][i]ein kleines game für die die lust haben http://konaminut.mybrute.com[/i][/b]
;-)
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.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Qt hat die Methode toUtf8(), die du auf den von `text()` zurückgelieferten QString (falls es einer ist) anwenden könntest.
INFACT
User
Beiträge: 385
Registriert: Freitag 5. Dezember 2008, 16:08

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...
[b][i]ein kleines game für die die lust haben http://konaminut.mybrute.com[/i][/b]
;-)
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!?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Leonidas Vortrag: http://wiki.python.de/User%20Group%20M% ... folien.pdf
Unicode HowTo: http://docs.python.org/howto/unicode.html

Einmal durcharbeiten, bevor du nochwas dazu postest.
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 ...
Antworten