Codierungsfehler

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
rickes6g
User
Beiträge: 3
Registriert: Mittwoch 23. November 2016, 12:22

Hallo liebe Python-Begeisterte,

ich habe ien kleines Problem. Ich habe eine .txt in Latin-1 vorliegen, und habe sie wie folgt in utf-8 umgeschrieben:

Code: Alles auswählen

datei = open(pfad.encode("utf-8"))
daten = datei.readlines()
datei.close()

# Codierung in UTF-8 ändern
neueliste = []
for eintrag in daten:
    eintrag = eintrag.decode("LATIN 1").encode("UTF-8")
    neueliste.append(eintrag)

Nun habe ich mit der Liste gearbeitet und sie modifiziert und sie mit pypyodbc in PostgreSQL übertragen, aber dort werden mir die Umlaute wie folgt angezeigt: "Düsseldorf" und "Talstraße"
Also ich arbeite mit der erstellten Liste in Schleifen usw. und habe diese dann mit hilfe von pypyodbc in Postgres übertragen und nun werden die Umlaute so angezeigt, woran liegt das?

Liebe Grüße,
Sandra
BlackJack

@rickes6g: Wo ist ”dort”, also wo wird Dir 'Düsseldorf' angezeigt?

Warum kodierst Du von Latin 1 nach UTF-8? Warum nicht nur nach Unicode dekodieren? Welche Kodierung erwartet der Datenbankadapter? Wie ist die Datenbank eingestellt? Wie die konkrete Tabelle/Spalte? Wie holst Du Die Daten wieder aus der Datenbank? Welche Kodierungen sind dabei eingestellt? Jeweils Client/Server/Anzeigeprogramm/….

Warum eigentlich ODBC für PostgreSQL?

Ich würde ja empfehlen im Programm bei Texten ausschliesslich mit Unicode zu arbeiten und die En-/Dekodierung dem Datenbankmodul zu überlassen. Eventuell muss man da etwas einstellen, damit es das macht.
rickes6g
User
Beiträge: 3
Registriert: Mittwoch 23. November 2016, 12:22

Hey @BlackJack, "Dort" ist in der db in Postgres.

Nach UTF-8 weil ich Abfragen auf die Städte mache, und das auch für Drittanwender möglich sein soll. Die Datenbank ist auf UTF-8 eingestellt. Die Tabelle wurde ansich nicht mehr anders codiert, sondern in python mit einerm cursor.execute(...) erstellt. Ich hole sie gar nicht aus der Db, ich habe sie mir diekt in der Datenbank angeschaut über pgAdmin.

Was spricht gegen ODBC für PostgreSQL?

Liebe Grüße,
Sandra
BlackJack

@rickes6g: Die Erklärung zu UTF-8 kann ich nicht nachvollziehen. Wie gesagt, innerhalb von Programmen arbeitet man mit Textdaten als Unicode-Objekte, also `unicode` in Python 2 und `str` in Python 3. Nur an den ”Grenzen” zur Aussenwelt dekodiert man eingehende Daten und kodiert man ausgehende Daten. Und das sollte man wann immer möglich die jeweilige Schnittstelle erledigen lassen und nicht manuell selber machen.

Du kannst Dir nichts ”in” der Datenbank anschauen. pgAdmin ist ein Programm das sich mit der Datenbank verbindet, und dabei von einer Kodierung ausgeht. Und die Datenbank geht auch von einer Kodierung aus. Das sollte besser die gleiche Kodierung sein, muss es aber nicht. Das heisst wenn die Daten so angezeigt werden, kann es sein das die so kaputt in der Datenbank liegen, es kann aber auch sein das sich pgAdmin und die Datenbank nicht über die Kodierung einig sind und pgAdmin die falsch darstellt. Es kann sogar sein das man kaputte Daten in der Datenbank stehen hat und pgAdmin die richtig anzeigt, nämlich wenn beim Eintragen in die Datenbank und beim Auslesen jeweils die falsche Annahmen über die Kodierung gemacht wurden. Kodierung ist ein lustiges Thema. :twisted:

ODBC ist noch eine weitere Schicht zwischen Programm und Datenbank. Also statt `programm <-> db client <-> db server` hat man dann `programm <-> odbc <-> db client <-> db server`. Wenn es keinen guten Grund für die Zwischenschicht gibt, würde ich sie weglassen. Ich weiss nicht ob ODBC Ahnung von Kodierungen hat oder nur Bytes durchreicht, aber wenn man auch dort mit Kodierungen zu tun hat, sind auch dort zwei Kodierungseinstellungen die falsch sein könnten.

Und da ich persönlich immer SQLAlchemy für Datenbankzugriffe verwende: Das unterstützt PostgreSQL nicht über ODBC. :-)
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@rickes6g: Für die programminterne Repräsentation solltest Du wirklich immer Unicode-Strings nehmen. Der Datenbankadapter weiß am besten welche Codierung die Datenbank erwartet. Bist Du Dir sicher, dass die Datei, die Du da lädst Latin-1-codiert ist?

Die Frage ist eher, warum man ODBC verwenden soll, wenn man auch direkt auf die Datenbank zugreifen kann. Man hat damit einen Umweg, der zu zusätzlichen Fehlern führen kann (was z.B. die Kodierung betrifft), hat weniger Funktionalität und kompliziertere Konfiguration.
Der einzige Grund wär, wenn man die Datenbank einfach austauschen will, aber dafür gibt es SQLAlchemy, das neben der Austauschbarkeit noch viele weitere Vorteile hat, z.B. dass man nicht direkt SQL programmieren muß.
rickes6g
User
Beiträge: 3
Registriert: Mittwoch 23. November 2016, 12:22

Da komme ich jetzt irgendwie nicht mehr hinterher. Wie meint ihr das mit direkt auf die Datenbank zugreifen, pypyodbc ist ja nur das Modul, dass ich benutze um auf die db zuzugreifen, oder?

Ich kann doch in einer Liste, die in unicode ist, keine strings mit nem "ü" drin suchen, oder?
BlackJack

@rickes6g: `pyodbc` ist ein Modul über das man via ODBC auf Datenbanken zugreift. ODBC geht dann über einen konkreten Datenbankclient an die Datenbank. Das ist eine Indirektion für die man einen Grund haben sollte. Statt zum Beispiel `psycopg2` zu verwenden was nicht über ODBC mit der Datenbank kommuniziert, sondern eben direkt ein Datenbankclient ist.

Wieso sollte man in einer Liste mit Unicode-Zeichenketten nicht nach einer Unicode-Zeichenkette mit einem 'ü' drin suchen können?

Code: Alles auswählen

In [1]: u'tüüüt' in [u'blah', u'tüüüt', u'blub']
Out[1]: True
Antworten