Seite 1 von 1

werd aus ner Fehlermeldung nicht schlau

Verfasst: Mittwoch 19. November 2008, 14:13
von shakebox
Hi!

Ich versuche mit folgendem Modul: http://www.lfd.uci.edu/~gohlke/code/fmkr.py.html aus einem Script heraus auf ne Filemaker-Datenbank zuzugreifen. Das hat bei ner anderen Datenbank auch schon wunderbar funktioniert. Mit einer mit der ich es jetzt probiere klappt es aber irgendwie gar nicht und ich werde aus der Fehlermeldung nicht so ganz schlau. Wenn ich folgendes probiere:

Code: Alles auswählen

from fmkr import FM, FMError
fmi = FM("filemaker", 80, "http")
fmi.set_db_data("FXManagerProject", "all_fields", maxret=50)
fmi.set_db_password("xmlquery", "xmlquery1")
fmi.add_db_param("IDNumberProject", "282", "bw")
result = fmi.fm_find()
dann bekomme ich diese Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/mnt/libs/pythonlib/modules/fmkr.py", line 287, in fm_find
    return self._commit("find")
  File "/mnt/libs/pythonlib/modules/fmkr.py", line 397, in _commit
    metadata.append(FMField(field.attributes))
  File "/mnt/libs/pythonlib/modules/fmkr.py", line 499, in __init__
    self.name = str(attributes["NAME"].value)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xc4' in position 7: ordinal not in range(128)
Was genau meint denn der Fehler und wo kommt dieses falsche Zeichen denn her? Wenn ich meine Strings die ich uebergebe anschaue seh ich irgendwie keine Zeichen die jetzt nicht ASCII sind oder sowas.

Die Datenbank ist nicht von mir und leider sind die Bezeichner fuer Felder, Layouts und Scripte nicht sehr geschickt gewaehlt. Manche haben Leerzeichen drin, Umlaute, usw. Wenn ich so ein Feld abfragen wuerde koennte ich verstehen dass es Probleme gibt. Aber genau deshalb hab ich eigentlich extra ein Feld gewaehlt und ein Layout bei denen das meiner Meinung nach nicht zutrifft.

Fuer alle Denkanstoesse froh dankt schon im Voraus der

Shakebox

Re: werd aus ner Fehlermeldung nicht schlau

Verfasst: Mittwoch 19. November 2008, 14:22
von numerix
shakebox hat geschrieben:Was genau meint denn der Fehler und wo kommt dieses falsche Zeichen denn her? Wenn ich meine Strings die ich uebergebe anschaue seh ich irgendwie keine Zeichen die jetzt nicht ASCII sind oder sowas.
Da hast du wohl nicht genau genug geguckt, denn bei dem bemängelten Zeichen handelt es sich um ein "Ä", was eben nicht zum ASCII (unterhalb Code 128) gehört.

Verfasst: Mittwoch 19. November 2008, 14:31
von shakebox
Danke fuer die schnelle Antwort. Dass da irgendwo ein nicht-ASCII-konformes Zeichen drin ist, ist mir klar. Nur verstehe ich eben nicht, wo. Denn in meiner Abfrage hab ich ja eben kein "Ä" drin. Ist das Ä dann also in einem der Felder dieser Datenbank als Wert drin oder wie ist das zu verstehen?

Im Moment bin ich einfach ein wenig ueberfordert mit der Fehlermeldung, wo ich denn ueberhaupt suchen muss. Ist es ein Feldname, ein Feldwert, mein Abfragestring oder noch was ganz anderes wo das Ä drinsteht?

Verfasst: Mittwoch 19. November 2008, 14:38
von numerix
Zwar kenne ich das besagte Modul nicht, aber die (vor)letzte Zeile des Tracebacks deutet darauf hin, dass es ein Feld "NAME" gibt und dass der Versuch, den Wert in diesem Feld in str umzuwandeln, zur Fehlermeldung führt, weil da das "Ä" drinsteckt.

Mit der Suche anfangen musst du in Zeile 499 des Moduls ... :wink:

Verfasst: Mittwoch 19. November 2008, 14:42
von shakebox
ok, danke soweit, das hilft mir glaub schon weiter. Ich hab schon nen Verdacht. Mir zu uebersetzen dass "u'\xc4'" ein "Ä" ist war glaub der entscheidende Tipp.

BTW: wie kann man das in Python denn schnell rauskriegen? Mit so Zeichencodierung usw. hab ich mich noch nicht beschaeftigt. Danke!

Verfasst: Mittwoch 19. November 2008, 14:47
von numerix
shakebox hat geschrieben: das in Python denn schnell rauskriegen? Mit so Zeichencodierung usw. hab ich mich noch nicht beschaeftigt. Danke!

Code: Alles auswählen

In [3]: print u'\xc4'
Ä

Verfasst: Mittwoch 19. November 2008, 14:53
von shakebox
das hatte ich eben probiert und bekomme folgendes:

Code: Alles auswählen

>>> print u'\xc4'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xc4' in position 0: ordinal not in range(128)
Ist da insgesamt bei mir irgendwas falsch konfiguriert oder geht das erst ab 2.6 oder was stimmt da nicht?

Verfasst: Mittwoch 19. November 2008, 15:00
von Leonidas
Python kann eben nicht herausfinden, was das Encoding deiner Konsole ist und schaltet also auf ACII, und voila, es kracht weil Ä nicht in ASCII vorhanden ist.

Verfasst: Mittwoch 19. November 2008, 18:03
von lunar
So pauschal ist das Unsinn. "print" wertet das "encoding" Attribut des verwendeten Dateiobjekts aus, und zumindest unter Linux haben sys.stdout und sys.stderr ein solches encoding-Attribut (das wohl aus aus $LANG abgeleitet wird). "print u'\xc4'" funktioniert hier zumindest, und gibt wie erwartet "Ä" aus.

Verfasst: Mittwoch 19. November 2008, 18:14
von Leonidas
Ok, ich hole weiter aus und erzähle das was ich jedes mal erzähle:

Unicode kann nicht direkt ausgegeben werden - gar nicht. Wenn man nun einen Unicode-String hat, dann steht der erstmal so für sich da. Wenn man nun aber ``print`` aufruft und einen Unicode-String übergibt, dann muss ja damit etwas passieren, da man es so nicht anzeigen kann. Also muss man es in einen Bytestring konvertieren. Das läuft dann so ab, dass das Encoding des Ausgabestroms geprüft wird und dieses Encoding verwendet wird, um den Unicodestring in einen Bytestring zu konvertieren. Dieser Bytestring wird dann in den Ausgabestrom geschrieben, die Konsole liest ihn und stellt ihn dann richtig dar. Bei dir ist der Fehler, dass das Encoding des Ausgabestroms ASCII oder unbekannt ist. Python 2.x nimmt bei unbekannt immer ASCII an. Also wird versucht, deinen Unicode-String mit dem Ä in einen ASCII-enkodierten Bytestring zu konvertieren. Das schlägt aber fehl, weil ASCII kein Byte definiert, mit dem Ä dargestellt wird - also gibt es eine Exception.