Mal wieder encoding Probleme

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
beatrix.w
User
Beiträge: 16
Registriert: Freitag 2. Mai 2014, 15:23

Hallo,

ich habe ein super-einfaches Script:

Code: Alles auswählen

#!/usr/bin/env python3
import ftfy
import sys

ftfy_result = ftfy.fix_file(open(sys.argv[1]), 'utf-8')
fixed_string = ""

for line in ftfy_result:
    fixed_string = fixed_string + line

print(fixed_string)
Dieses funktioniert im Debugger von PyCharm und wenn ich es im Terminal ausführe. Wenn ich mit py2app eine App daraus baue, bekomme ich beim Ausführen im Terminal eine Fehlermeldung:

Trixis-Mac-Pro:~ beatrixwillius$ /Users/beatrixwillius/dist/fix_encoding.app/Contents/MacOS/fix_encoding /Users/beatrixwillius/Desktop/test.txt
Traceback (most recent call last):
File "/Users/beatrixwillius/dist/fix_encoding.app/Contents/Resources/__boot__.py", line 98, in <module>
_run()
File "/Users/beatrixwillius/dist/fix_encoding.app/Contents/Resources/__boot__.py", line 82, in _run
exec(compile(source, path, 'exec'), globals(), globals())
File "/Users/beatrixwillius/dist/fix_encoding.app/Contents/Resources/fix_encoding.py", line 8, in <module>
for line in ftfy_result:
File "ftfy/__init__.pyc", line 219, in fix_file
File "encodings/ascii.pyc", line 26, in decode
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
2018-03-17 14:58:44.907 fix_encoding[11128:3843692] fix_encoding Error

Da ich das ja nicht im Debugger bekomme, habe ich keine Ahnung, wie ich das beheben soll. Das übliche "encode('utf8')" bei der line-Variable hat nicht geholfen.

Ich habe das Programm und meine Test-Datei auf http://www.mothsoftware.com/downloads/fix.zip hochgeladen .

macOS 10.11, Python 3.6.

Grüße

Beatrix Willius
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Hallo Beatrix,

nur kurz: du kannst auch in dem App-Bundle Debuggen. Einfach ein „import pdb;pdb.set_trace()” im Python Code davor stellen.

Wenn du das Programm dann über die Kommandozeile startest (MyApp.app/Contents/MacOS/MyApp) solltest du da im breakpoint landen.
Benutzeravatar
pixewakb
User
Beiträge: 1407
Registriert: Sonntag 24. April 2011, 19:43

Ich bin kein Experte fürs Encoding, aber ich füge i. d. R. die Encoding-Zeile in meine Skripte ein:

Code: Alles auswählen

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
Ferner öffne ich die Datei dann mit Notepad++ und schaue, dass ich im Memü "Kodierung" dann "UTF-8" oder "UTF-8 ohne DOM" auswähle, hierzu gehe ich wie folgt vor: Strg. + A (unter Windows) und Strg. + X, dann stelle ich die Kodierung um und dann Strg. + V. Das verhindert, dass Zeichen geändert werden, was ich nicht möchte.

Es ist etwas her, dass ich mich mit Kodierungs-Problemen herumschlagen musste.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@pixewakb: das Problem hat nichts damit zu tun, dass eine Python-Datei ein falsches Encoding hat. Da es sich um Python3 handelt, ist UTF8 sowieso das Defaultencoding von Python-Dateien.

@beatrix.w: das Problem mit Python3 ist, dass es so tut, als ob es mit Encodings automatisch umgehen kann, und so Unbedachte reinfallen. Je nach Umgebung ist nämlich das Default-Encoding, mit dem Dateien entschlüsselt werden, unterschiedlich. Bisher hast Du anscheinend immer UTF8 als Default, py2app scheint aber ASCII als Default zu nehmen. Daher solltest Du bei allen Textdateien, die Du öffnest immer das Encoding explizit angeben, oder da Du hier ja sowieso ein Modul verwendest, das das Encoding raten kann, die Datei binär öffnest:

Code: Alles auswählen

#!/usr/bin/env python3
import ftfy
import sys

ftfy_result = ftfy.fix_file(open(sys.argv[1], "rb"), 'utf-8')
fixed_string = "".join(ftfy_result)
print(fixed_string)
Beim Ausgabeencoding via `print` könnte es ähnliche Probleme geben.
Benutzeravatar
pixewakb
User
Beiträge: 1407
Registriert: Sonntag 24. April 2011, 19:43

Sirius3 hat geschrieben:@pixewakb: das Problem hat nichts damit zu tun, dass eine Python-Datei ein falsches Encoding hat. Da es sich um Python3 handelt, ist UTF8 sowieso das Defaultencoding von Python-Dateien.
Ich habe mal eine Datei angelegt, in Notepad++ geöffnet und die Kodierung kontrolliert und es ist "ANSI", also ASCII o. ä. und nicht UTF8!? (Vor einigen Jahren hatte ich damit mal Probleme und es half, die Codierung der Quelldateien explizit anzugeben und in Notepad++ festzulegen.)
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Solltest du dann nicht lieber BOM beachten statt den Dom damit zu belästigen?
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Benutzeravatar
pixewakb
User
Beiträge: 1407
Registriert: Sonntag 24. April 2011, 19:43

darktrym hat geschrieben:Solltest du dann nicht lieber BOM beachten statt den Dom damit zu belästigen?
Peinlich, sorry. Danke für den Hinweis.
beatrix.w
User
Beiträge: 16
Registriert: Freitag 2. Mai 2014, 15:23

Vielen Dank für die Hilfe!

@Sirius3: Das war ein wirklich subtiler Fehler.

@darktrym: BOM kann hier nicht helfen, da die Daten aus Emails kommen.

Ich wünsche einen nicht zu verschneiten Sonntag.

Beatrix Willius
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

pixewakb hat geschrieben:
darktrym hat geschrieben:Solltest du dann nicht lieber BOM beachten statt den Dom damit zu belästigen?
Peinlich, sorry. Danke für den Hinweis.
Auch ansonsten geht es hier um die Kodierung einer vom Programm geöffneten Datei. Dein Hinweis greift nur für Python-Quelltext. Für Daten, die das Programm aus anderen Dateien bezieht, ist er nutzlos.

EDIT:
Oder öffnest du jede Eingabedatei genau so...?
Antworten