assertion `g_utf8_validate (text, len, NULL)' failed

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
Benutzeravatar
atarax
User
Beiträge: 44
Registriert: Samstag 14. Juni 2008, 22:49
Wohnort: Berlin
Kontaktdaten:

Mein Skript macht eine Datenbankabfrage über das Internet. Ich erhalte als Antwort folgende Liste:

Code: Alles auswählen

{'EXTT0': '', 'EXTT1': '', 'EXTT2': '', 'EXTT3': '', 'EXTT4': '', 'EXTT5': '', 'EXTT6': '', 'EXTT7': '', 'EXTT8': '', 'EXTT9': '', 'DTITLE': 'Clannad / Clannad 2', 'DYEAR': '1988', 'DISCID': '9609e60b', 'EXTD': '', 'EXTT10': '', 'DGENRE': 'Alternative', 'revision': 5, 'TTITLE9': 'Fairly Shot of Her', 'TTITLE8': 'Teidhir Abhaile Ri\xfa', 'TTITLE5': 'Rince Briot\xe1nach', 'TTITLE4': 'By Chance It Was', 'TTITLE7': 'Gaoth Barra Na dTonn', 'TTITLE6': 'Dheanainn S\xfagradh', 'TTITLE1': 'Eleanor Plunkett', 'TTITLE0': 'An Gabhar B\xe1n', 'TTITLE3': "Rince Philib a'Cheoil", 'TTITLE2': 'Coinleach Ghlas an Fh\xf3mair', 'TTITLE10': "Chuaigh M\xe9 'Na Rosann", 'PLAYORDER': '', 'submitted_via': 'BonkEnc v1.0'}
Offenbar sind Sonderzeichen hier hexadezimal verschlüsselt. Wenn ich versuche, die einzelnen Werte mit gtk.TextBuffer.set_text() zu verarbeiten, erhalte ich folgenden Fehler:

GtkWarning: gtk_text_buffer_emit_insert: assertion `g_utf8_validate (text, len, NULL)' failed

Gibt es eine Funktion, mit der ich die Zeichen vorher in UTF-8 umwandeln kann, so dass der Fehler nicht auftritt? Vielen Dank!
http://www.decocode.de/
BlackJack

@atarax: Die Sonderzeichen sind nicht Hexadezimal verschlüsselt, das ist nur die Anzeige, damit Du sehen kannst was da tatsächlich drin steht. Wenn man Dictionaries oder Listen in Zeichenketten umwandelt, werden die einzelnen enthaltenen Elemente über die `repr()`-Funktion in Zeichenketten umgewandelt, und Zeichenketten werden dabei nur mit ASCII-Zeichen dargestellt und alles was ausserhalb dessen liegt, wird als Hexadezimale Escape-Sequenz dargestellt.

Wenn Du das in UTF-8 umwandeln möchtest, musst Du die Kodierung die vorliegt in Unicode wandeln und das dann in UTF-8. Dazu musst Du wissen in welcher Kodierung die Daten vorliegen.
Benutzeravatar
atarax
User
Beiträge: 44
Registriert: Samstag 14. Juni 2008, 22:49
Wohnort: Berlin
Kontaktdaten:

Danke für die Antwort. Nach den FAQ von FreeDB dürfte die Kodierung ISO-8859-1 sein. ASCII scheidet aus, da es keine Sonderzeichen enthält und UTF-8 scheidet wohl aus, da die Inhalte des Dictionarys sonst nicht maskiert ausgegeben würden, oder bring ich da was durcheinander?
Wenn Du das in UTF-8 umwandeln möchtest, musst Du die Kodierung die vorliegt in Unicode wandeln und das dann in UTF-8. Dazu musst Du wissen in welcher Kodierung die Daten vorliegen.
Kannst du mir dazu mal ein Beispiel-Snippet nennen? Bei der Beschreibung von repr() in der Dokumentation habe ich nur Bahnhof verstanden. Merci.
http://www.decocode.de/
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

atarax hat geschrieben:.. und UTF-8 scheidet wohl aus, da die Inhalte des Dictionarys sonst nicht maskiert ausgegeben würden, oder bring ich da was durcheinander?
Ja tust du. In Python 2.x werden Strings die per `repr` ausgegeben werden immer in ASCII Format ausgegeben, um DecodingErrors auszuschliessen.

Edit: `repr` ist der falsche Ort zum suchen.

Code: Alles auswählen

In [1]: a = 'Coinleach Ghlas an Fh\xf3mair'

In [2]: a.decode('latin1')
Out[2]: u'Coinleach Ghlas an Fh\xf3mair'

In [3]: s = a.decode('latin1')

In [4]: print s
------> print(s)
Coinleach Ghlas an Fhómair
Benutzeravatar
atarax
User
Beiträge: 44
Registriert: Samstag 14. Juni 2008, 22:49
Wohnort: Berlin
Kontaktdaten:

Super, vielen Dank. Hat funktioniert.
http://www.decocode.de/
Antworten