Seite 1 von 1

Problem mit Zeichenkodierung bei Verwendung von pyinstaller

Verfasst: Montag 4. Februar 2008, 19:16
von numerix
Hintergrund: Ich experimentiere z.Zt. mit verschiedenen Möglichkeiten von Python, um auszuloten, was geht und was nicht geht. Meine eigentliche Entwicklungsplattform ist Linux (mit KDE), zum Testen des Verhaltens unter Windows habe ich parallel eine Python-Installation unter Wine eingerichtet.

Ich habe eine kleine Tkinter Anwendung geschrieben, die - vereinfacht gesagt - zwei Textfenster enthält (Text-Widgets). In das eine Fenster gibt man einen Text ein, drückt einen Button, im anderen Fenster kommt der Text dann verändert wieder heraus. Das funktioniert auch wie es soll, also kein Tkinter-Problem.

Problematisch sind deutsche Umlaute, da sie außerhalb des 7-Bit-ASCII liegen und den Einsatz von Unicode erfordern. Konkret:

Linux-Version als py-Skript: Alles einwandfrei.
wine-Version als py-Skript: Alles einwandfrei.
Unter wine mit py2exe erzeugte exe-Datei unter wine ausgeführt: Alles einwandfrei.
Unter wine mit pyinstaller erzeugte exe-Datei unter wine ausgeführt: Problem mit Umlauten (sonst funktioniert es auch hier). Die Verarbeitung des eingegebenen Textes nach Knopfdruck wird nicht durchgeführt. Hat man die Konsole offen, gibt es eine Fehlermeldung bei der Zeichendekodierung:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xdc in position 12: ordinal not in range(128)

Der Fehler betrifft die Zeile, in der der Text aus dem Eingabefenster ausgelesen wird:

Code: Alles auswählen

txt = unicode(self.txtOrig.get("1.0",tk.END))
Damit es keine Missverständnisse gibt: Es funktioniert in allen o.g. Fällen AUCH MIT UMLAUTEN einwandfrei, nur eben nicht mit der mit pyinstaller erzeugten exe-Datei.

Für hilfreiche Tipps wäre ich dankbar.

Verfasst: Montag 4. Februar 2008, 19:28
von numerix
Nochmal nachgedacht, noch was probiert ...
... und selbst gelöst.

So funktioniert es auch mit der pyinstaller exe-Datei und den Umlauten:

Code: Alles auswählen

txt = self.txtOrig.get("1.0",tk.END)
if isinstance(txt,unicode):
    txt = txt.encode("iso-8859-15")