UnicodeDecodeError bei Zuweisung von Variablen

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
Benutzeravatar
Ande
User
Beiträge: 24
Registriert: Donnerstag 24. März 2011, 18:36

Hey,
ich bin gerade auf einen UnicodeDecodeError gestoßen.

Code: Alles auswählen

#   File "<Script Block >", line 33, in exportMSH_OnClicked
#     msh2_framework.packMSHFile( models, materials, True )
#   File "C:\Users\Administrator\Autodesk\Softimage_2012_SP1\Addons\XSIZETools\Application\Plugins\msh2_framework\msh2_framework.py", line 430, in packMSHFile
#     packed_mats = []
#   File "C:\Users\Administrator\Autodesk\Softimage_2012_SP1\Addons\XSIZETools\Application\Plugins\msh2_framework\msh2_framework.py", line 342, in packMesh
#     data += struct.pack('<L',obj.attribute_0)
# UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position 90: ordinal not in range(128)
Die Zeilenangabe verweist aber komischerweise auf diese Zeile(auch wenn ich noch ne Zeile einfüge oder so, immer diese Zeile), das könnte daran liegen, dass der Script durch ein Programm ausgeführt wird(Softimage 2012):

Code: Alles auswählen

mdata += geodata[0]
Beide Variablen sind strings(binary), also "normale" strings und durch struct gepackten Ints/Floats/Shorts. Ich hab schon gegoogelt, aber nicht wirklich was dazu gefunden... An was könnte das liegen? Könnten die beiden Variablen ein unterschiedliches encoding haben? Muss ich für binary/gepackte strings bytes oder sowas(wie str()/int()) davor schreiben?
Wenn ihr den code braucht, kann ich ihn posten, das sind aber 400+ Zeilen + 200 Zeilen für das Softimage plugin, und das nimmt Information von der Selektion im Viewport in dem Moment, also kann man das auch nicht testen ohne die software.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Irgendwie ist die Fehlermeldung komisch an dieser Stelle. Welchen Typ haben denn 'data' und 'obj.attribute_0'?

Edit: Wahrscheinlich liegt 'data' in Unicode vor und er versucht, die Bytes der Zahl implizit zu decodieren (daher mit ASCII). Wobei sich mir die Frage stellt, warum Du eine Zahl in Byterepräsentation mit einem Unicodestring addieren willst.
Benutzeravatar
Ande
User
Beiträge: 24
Registriert: Donnerstag 24. März 2011, 18:36

data ist ein String, obj.attribute_0 ein Int, da struct.pack() einen String zurückgibt müsste das eigentlich passen(wobei ich mir immer noch nicht sicher bin, dass die Zeile wirklich das Problem ist sondern eher die Zeile auf die in dem Log verwiesen wird).
Alle Variablen, die bei mir data im Namen haben, haben vor allem Zahlen in Byterepräsentation im String. Die Strings(oder am Ende ein String)sollen dann in eine Datei geschrieben werden.
Bis jetzt habe ich für die header der chunks(die die Bytezahlen beinhalten) einfach einen "ganz normalen" String genommen, also:

Code: Alles auswählen

data = 'MODL'
data += struct.pack('<L', integer)
data += mehrZahlen
Bewusst mache ich nichts mit Unicode(also kein decoding/encoding/lesen von Dateien). Könnte es sein, dass zB Namen aus Softimage in Unicode sind? Diese würde ich dann mit string.encode('utf-8') encoden?
BlackJack

@Ande: Kannst Du das nicht ganz einfach mit ``print`` und `type()` heraus finden!?
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Ande hat geschrieben:Alle Variablen, die bei mir data im Namen haben, haben vor allem Zahlen in Byterepräsentation im String. Die Strings(oder am Ende ein String)sollen dann in eine Datei geschrieben werden.
Vorallem? Das Mischen von Zahlen im Binärformat mit Strings ohne Delimitern führt zu Datensalat. Wie entscheidest Du später, was Zahl und was ASCII-Zeichen war?
Ande hat geschrieben:Bewusst mache ich nichts mit Unicode(also kein decoding/encoding/lesen von Dateien). Könnte es sein, dass zB Namen aus Softimage in Unicode sind? Diese würde ich dann mit string.encode('utf-8') encoden?
Der Fehlermeldung zufolde ist 'data' Unicode. Woher 'data' gefüttert wird, weiss ich nicht. `print type(data)` sollte hier Licht ins Dunkel bringen. Das encode() könnte dann helfen, allerdings solltest Du das passende Encoding zu Deiner Anwendung/System nehmen ('utf8' erscheint mir hier allzu sehr geraten zu sein).

Wahrscheinlich können wir Dir besser weiterhelfen, wenn Du ein paar Details zum Dateiformat preisgibst. Dieser Mix aus Zahlen und String-Encodings ist sonst nicht zu durchschauen.
Benutzeravatar
Ande
User
Beiträge: 24
Registriert: Donnerstag 24. März 2011, 18:36

Habs jetzt gelöst, verschiedene Strings aus Softimage(Modell-/texturnamen) waren in Unicode.

Das Dateiformat(http://ande.pytalhost.eu/msh_format.htm)hat als header Strings und in manchen Chunks Strings(zB NAME). Die Strings aus Softimage habe ich bis jetzt einfach nur zu den anderen "addiert", da struct Methoden ja "normale" Strings zurückgeben und ich die Header auch per Code eingefügt habe, waren die natürlich "normal" während die Namen aus Softimage Unicode sind. Ich habe jetzt aber die Unicode strings nach utf-8 encoded(dann ist alles vom typ str...), nicht das andere nach Unicode. Die Strings werden ja auch nicht nach Softimage zurückgegeben.
Das Dateiformat hat niemals String und Zahl in einem Chunk, also ist das unterscheiden einigermaßen einfach.
Antworten