2012-04-04 11 views
0

Also kurz gesagt meinem Fall ist dies:Python 2.7 Codierung und feedparser

  • lesen Daten aus RSS-Feed
  • drucken Inhalt an das Terminal

Und natürlich der Inhalt ist nicht in einfach ascii, es ist utf-8, also bekomme ich Zeichen wie "öäå". Aber wenn ich den Text drucke, ist alles mit Landschaften wie '\ xe4' zerfetzt. Etwas, das mit der Kodierung zu tun hat, aber ich kann es einfach nicht verstehen. Das sollte so trivial sein, aber Google Fu lässt mich im Stich.

Ein Beispiel ist, wenn ich durch den Inhalt Wort für Wort zu gehen und versuchen, den Charakter „ö“ zu finden: Ich tue:

if u"ö" in word: 

die nur gibt: UnicodeDecodeError: ‚ascii‘ Codec‘ t dekodieren Byte 0xC3 in Position 6 ...

Edit:

Also ich denke, ich mein Problem gefunden. Ich bekam die Feed-Elemente dann nur str (entry.content) und passierte das weiter, aber dieser entry.content war eine Liste, die ein Wörterbuch mit Unicode-Strings als Werte enthielt. Also habe ich (glaube ich) nur einen ASCII-Wert bekommen Darstellung des Wörterbuchinhalts ...

+0

http://nedbatchelder.com/text/unipain.html –

Antwort

2

Sie versuchen, kodierten Text mit Unicode zu vergleichen. Python weiß nicht, dass der kodierte Text UTF-8 ist, daher rät er es in ASCII und versucht, es für Unicode zu dekodieren. Die Lösung besteht darin, sie explizit mit der richtigen Codierung zu dekodieren.

Überprüfen Sie die Python Unicode HOWTO für weitere Informationen.

ich Ihr Problem mit dieser Datei wiedergeben kann:

# coding: utf-8 

word = "öäå" 
if u"ö" in word: 
    print True 

und fixieren Sie es mit dieser Datei:

# coding: utf-8 

word = "öäå".decode('utf-8') 
if u"ö" in word: 
    print True 
+0

Ich denke, mein Problem ist, dass, während der Inhalt des Wortes "öäå" sein sollte, das Zeug, das ich vom Parser bekomme, nur Fluchten wie '\ xe4' ist, Sie sind Art von Str, während ich denke, ich sollte Unicodes haben. Ich brauche also einen Weg, um diese Fluchten zurück in die reale Darstellung zu konvertieren. Oder etwas ähnliches, Kopfschmerzen aus diesem Problem zu bekommen: D – Guu

+0

Während das Problem aufgrund meines eigenen Versagens und der Unfähigkeit zu RTFM war, akzeptiere ich das immer noch. – Guu

+0

@Guu Nur weil sie als Escapes in Ihrem REPL oder Terminal angezeigt werden, bedeutet das nicht, dass sie als Eascapes gespeichert sind - sie sind es nicht, oder Sie würden diesen Fehler nicht bekommen. So werden Bytewerte über 128 in einer ASCII-Umgebung angezeigt. – agf

0

Wenn Sie wissen, dass Ihr Text UTF-8 ist, können Sie es in dekodieren unicode Objekte, bevor Sie anfangen, mit ihnen zu arbeiten. Sobald Sie die Bytes aus der Datei gelesen haben, können Sie sie mit der decode()-Methode von Strings wie word.decode('UTF8') dekodieren, um die Unicode-Objekte zurückzugeben.