Unicode Problem mit SQLAlchemy

8

Ich weiß, dass ich ein Problem mit einer Konvertierung von Unicode habe, aber ich bin mir nicht sicher, wo es passiert.

Ich extrahiere Daten über eine kürzlich durchgeführte Reise nach Europa aus einem Verzeichnis von HTML-Dateien. Einige der Ortsnamen haben Nicht-ASCII-Zeichen (wie z. B. é, ô, ü). Ich erhalte die Daten aus einer String-Repräsentation der Datei mit Regex.

Wenn ich die Orte so drucke, wie ich sie finde, werden sie mit den Zeichen gedruckt, so dass die Codierung in Ordnung sein muss:

%Vor%

Ich speichere die Daten in einer SQLite-Tabelle mit SQLAlchemy:

%Vor%

Ich durchlaufe die Dateien und füge die Daten von jedem in die Datenbank ein:

%Vor%

Ich sehe die folgende Warnung auf jedem Einsatz:

%Vor%

Und wenn ich versuche, etwas mit der Tabelle zu tun, wie zum Beispiel:

%Vor%

Ich bekomme:

%Vor%

Ich möchte in der Lage sein, die Ortsnamen mit den ursprünglichen intakten Zeichen korrekt zu speichern und dann zurückzugeben. Jede Hilfe würde sehr geschätzt werden.

    
Dave Forgac 08.06.2009, 18:50
quelle

3 Antworten

11

Ich fand diesen Artikel, der dazu beitrug, meine Probleme etwas zu erklären:

Ссылка

Ich konnte die gewünschten Ergebnisse erzielen, indem ich das Modul 'Codecs' verwendete und dann mein Programm wie folgt änderte:

Beim Öffnen der Datei:

%Vor%

Beim Drucken des Standorts:

%Vor%

Ich kann jetzt die Daten aus der Tabelle abfragen und bearbeiten, ohne den Fehler von vorher. Ich muss nur die Codierung angeben, wenn ich den Text ausgabe.

(Ich verstehe immer noch nicht ganz, wie das funktioniert, also denke ich, es ist Zeit, mehr über Pythons Unicode-Handhabung zu erfahren ...)

    
Dave Forgac 08.06.2009, 21:41
quelle
7

Von sqlalchemy.org

Siehe Abschnitt 0.4.2

  

hat eine neue Flagge zu String und hinzugefügt   create_engine (),         assert _unicode = (Wahr | Falsch | 'warnen' | Keine).   Der Standardwert ist False oder None on         create _engine () und String, 'warn' für den Unicode-Typ. Wann   %Code%,         führt zu allen Unicode - Konvertierungsoperationen, die ein   Ausnahme wenn a         Non-Unicode-Bytestring wird als Bindungsparameter übergeben. 'warnen' Ergebnisse         in einer Warnung. Es wird dringend empfohlen, dass alle Unicode-bewusst sind   Anwendungen         Verwenden Sie Python-Unicode-Objekte richtig (d. h. u'hello 'und nicht   'Hallo')         so dass Daten Rundreisen genau.

Ich denke, Sie versuchen, einen Nicht-Unicode-Byte-String einzugeben. Vielleicht führt Sie das auf die richtige Spur? Irgendeine Form der Umwandlung wird benötigt, vergleiche "Hallo" und "Hallo".

Prost

    
ralphtheninja 08.06.2009 21:34
quelle
7

Versuchen Sie, für die Unicode-Spalten einen Spaltentyp Unicode anstelle von String zu verwenden:

%Vor%

Bearbeiten: Antwort auf Kommentar:

Wenn Sie Warnungen über Unicode-Kodierungen erhalten, können Sie zwei Dinge ausprobieren:

  1. Konvertiere deinen Standort in Unicode. Dies würde bedeuten, dass dein Point wie folgt erstellt wird:

    newpoint = Punkt (Dateiname, pdate, ptime, Unicode (Ort), Wetter, hoch, niedrig, lat, lon, Bild, Bildunterschrift)

    Die Unicode-Konvertierung erzeugt eine Unicode-Zeichenfolge, wenn sie entweder als Zeichenfolge oder als Unicode-Zeichenfolge übergeben wird. Sie müssen sich also nicht darum kümmern, was Sie übergeben.

  2. Wenn das die Codierungsprobleme nicht löst, versuchen Sie, Encode auf Ihren Unicode-Objekten aufzurufen. Das würde bedeuten, einen Code wie:

    zu verwenden

    newpoint = Punkt (Dateiname, pdate, ptime, Unicode (Ort) .encode ('utf-8'), Wetter, hoch, niedrig, lat, lon, Bild, Bildunterschrift)

    Dieser Schritt ist wahrscheinlich nicht notwendig, aber was er im Wesentlichen tut, ist das Konvertieren eines Unicode-Objekts von Unicode-Codepunkten in eine bestimmte Byte-Repräsentation (in diesem Fall utf-8). Ich würde erwarten, dass SQLAlchemy dies für Sie tut, wenn Sie Unicode-Objekte übergeben, aber es möglicherweise nicht.

workmad3 08.06.2009 19:08
quelle