UnicodeEncodeError: 'ascii' codec can't encode characters...

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
nieselfriem
User
Beiträge: 135
Registriert: Sonntag 13. Januar 2013, 16:00

Hallo!

Ich habe folgendes Problem.

Ich lese eine XML-Datei ein die Umlaute enthält. Diese XML-Datei wird mit minidom eingelesen und die Einträge in zwei Listen gespeichert. Nach diversen Auswahlen und Eingaben soll dann der ausgewählte Text <text>Umlaute säÖÜ</text> in eine JSON-Datei geschrieben werden. Das Funktioniert auch so weit ganz gut. Wenn ich jedoch den Text für die JSON-Datei via Konsole unter Linux eingebe und die Datei speichern will, bekomme ich die Fehlermeldung:

Code: Alles auswählen

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
Ich hatte die Idee die Eingabe mittels

Code: Alles auswählen

bodytext = bodytext.encode('utf-8')
zu codieren.
Dies hilft jedoch leider nicht. Wichtig ist zu wissen, dass ich

Code: Alles auswählen

# -*- coding: utf-8 -*- und locale.setlocale(locale.LC_ALL, 'de_DE') 
verwende.

Was kann ich machen?

VG niesel
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Zeig uns bitte mal den *relevanten* Code-Teil, bei dem Meldung kommt. Die Meldung passt nicht zum Speichern, da es sich dabei um einen Fehler handelt, der beim *decodieren*, also dem Wandeln von Bytes in Unicode, auftritt. Dies ist typischer Weise beim Einlesen von Dateien der Fall...

Generell verweise ich für das Thema wieder auf meine Signatur :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@nieselfriem: Sowohl XML (das man am besten mit ElementTree/lxml statt mit minidom liest) als auch JSON arbeiten standardmäßig mit Unicode. Da sollte also kein Fehler beim Verarbeiten auftreten. Zeig doch den Code und den vollen Traceback des Fehlers.
Benutzeravatar
nieselfriem
User
Beiträge: 135
Registriert: Sonntag 13. Januar 2013, 16:00

Hi,

stimmt der Fehler kommt nicht beim speichern sondern bei dem Aufruf der Anweisung:

Code: Alles auswählen

bodytext = bodytext.encode('utf-8')
.
weiterhin hatte ich noch einen weiteren Encodierungsversuch an einer anderen Stelle im Quelltext. Diesen habe ich nun auch entfernt. Danach habe ich den Eingabestring in ein Unicode utf-8 Stream umgewandelt und nun kann ich die Datei mittels

Code: Alles auswählen

file = io.open(path, 'w', encoding='utf8')
        file.write(jsonString)
        file.close()

Aber dein Hinweis hat mir gut weiter geholfen. Danke :)

VG niesel
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Das sieht alles sehr abenteuerlich aus! Wieso nutzt Du nicht ``json.dump``? Dir ist schon klar, dass man nicht wahllos zwischen Bytes und Unicode-Strings wechseln sollte? Das gibt nur Verwirrungen...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten