Das deutsche Python-Forum Foren-Übersicht Das deutsche Python-Forum
Diskussionen rund um die Programmiersprache Python
 
 FAQFAQ   SuchenSuchen MitgliederlisteMitgliederliste BenutzergruppenBenutzergruppen   RegistrierenRegistrieren 
 Wiki FAQWiki FAQ WikiWiki ImpressumImpressum
 ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Umlaute Firebird etc

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche Python-Forum Foren-Übersicht -> Datenbankprogrammierung mit Python
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
pPilger
User


Anmeldungsdatum: 08.02.2010
Beiträge: 24

BeitragVerfasst am: Mo Feb 08, 2010 18:16    Titel: Umlaute Firebird etc Antworten mit Zitat

Hallo,

ich beginne gerade etwas in Python zu machen und habe mich mit den Umlauten ein wenig festgefahren:

Ich hole Datensätze aus einer Firebird-DB und möchte diese Daten in wieder in eine andere Tabellen schreiben.
Dabei bekomme ich z.B. diesen Fehler:
UnicodeEncodeError: 'ascii' codec can't encode character u'\xc4' in position 16: ordinal not in range(128)

Die Tabellen der db sind mit dem Zeichensatz WIN1252, also cp1252 angelegt.
Wenn ich die abgefragten Feldwerte im script prüfe, erhalte ich den typ unicode.
In meinen rückgabewerten steht da auch immer ein u davor: u'Mein Wert mit \xc4' (Mein Wet mit Ä)

Jetzt möchte ich diesen string einfach wieder in eine andere Tabelle bringen und bekomme obigen Fehler, wenn ich das ganze vor dem Insert so umwandle: c_title = b_title.encode("cp1252").

Wo liegt da mein Fehler?

Das python script habei c so auf diesen Zeichensatz gestellt:
# -*- coding: iso-8859-1 -*-

Programmierung und Test läuft unter linux ubuntu.

Danke für die Hilfe,
Jörg
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Hyperion
User


Anmeldungsdatum: 04.08.2006
Beiträge: 2080
Wohnort: Clausthal

BeitragVerfasst am: Mo Feb 08, 2010 18:27    Titel: Antworten mit Zitat

Sagst du dem DB-Modul vor dem Auslesen denn, in welchem Encoding die Daten vorliegen? Ich vermute mal, dass die Umkodierung von der DB in Unicode schief laufen könnte...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
BlackJack
Moderator


Anmeldungsdatum: 25.01.2005
Beiträge: 9942

BeitragVerfasst am: Mo Feb 08, 2010 18:34    Titel: Antworten mit Zitat

@pPilger: Du bekommst von der DB *unicode*-Objekte, warum *gibst* Du ihr denn nicht auch welche!?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen AIM-Name
pPilger
User


Anmeldungsdatum: 08.02.2010
Beiträge: 24

BeitragVerfasst am: Mo Feb 08, 2010 20:58    Titel: Antworten mit Zitat

BlackJack hat folgendes geschrieben:
@pPilger: Du bekommst von der DB *unicode*-Objekte, warum *gibst* Du ihr denn nicht auch welche!?


Weil Pyton dann den umgekehrten ascii-Decode-Fehler wirft...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
pPilger
User


Anmeldungsdatum: 08.02.2010
Beiträge: 24

BeitragVerfasst am: Mo Feb 08, 2010 21:00    Titel: Antworten mit Zitat

Hyperion hat folgendes geschrieben:
Sagst du dem DB-Modul vor dem Auslesen denn, in welchem Encoding die Daten vorliegen? Ich vermute mal, dass die Umkodierung von der DB in Unicode schief laufen könnte...

Wie mach ich das richtig?
ich benutze ganz normal z.B. fetchone()
was zurückgegeben wird ist dann z.B.
'1234',u'mein string mit codierten umlauten'
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Hyperion
User


Anmeldungsdatum: 04.08.2006
Beiträge: 2080
Wohnort: Clausthal

BeitragVerfasst am: Mo Feb 08, 2010 21:06    Titel: Antworten mit Zitat

pPilger hat folgendes geschrieben:

Wie mach ich das richtig?

k.A. wir hatten das hier neulich mal mit dem MySQLdb-Modul. Da gabs so ne art setEncoding() Funktion iirc.

Zitat:

ich benutze ganz normal z.B. fetchone()
was zurückgegeben wird ist dann z.B.
'1234',u'mein string mit codierten umlauten'

Nee, Das teilt man dem DB-Modul idR beim Verbindungsaufbau mit, also vor dem Absetzen von Queries.

Aber ich denke BlackJack hat da schon recht. Du solltest der DB auf jeden Fall wieder Unicode-Objekte übergeben. Teste es doch einfach mal erst, *ohne* vorher Daten aus einer DB zu holen, sondern schreib Unicode Daten aus dem Quellcode in die DB.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
pPilger
User


Anmeldungsdatum: 08.02.2010
Beiträge: 24

BeitragVerfasst am: Di Feb 09, 2010 19:00    Titel: Antworten mit Zitat

Zitat:

Aber ich denke BlackJack hat da schon recht. Du solltest der DB auf jeden Fall wieder Unicode-Objekte übergeben. Teste es doch einfach mal erst, *ohne* vorher Daten aus einer DB zu holen, sondern schreib Unicode Daten aus dem Quellcode in die DB.


Also ich hab jetzt folgendes überprüft.
Der Feldinhalt den ich aus der db hole, ohne irgendwelche connection-settings wegen des zeichensatzes zu machen, kommt in python so an:
<type 'unicode'>

Wenn ich das auch ohne connection settings weiterreiche bekomme ich folgenden fehler:
'ascii' codec can't encode character u'\xc4'

Das ist das "Ä", welches er nicht verträgt.

Wandle ich den Feldinhalt vor dem insert so um, wie er in der db gespeichert werden müsste:
s = s.encode('cp1252')

bekomme ich folgenden Fehler:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4

Das versteh ich noch nicht.
Auch wenn ich ein "Ä" aus dem script an die db schicke ist es das Gleiche.
Danke für die Hilfe!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Hyperion
User


Anmeldungsdatum: 04.08.2006
Beiträge: 2080
Wohnort: Clausthal

BeitragVerfasst am: Di Feb 09, 2010 20:00    Titel: Antworten mit Zitat

pPilger hat folgendes geschrieben:

Wenn ich das auch ohne connection settings weiterreiche bekomme ich folgenden fehler:
'ascii' codec can't encode character u'\xc4'

Und wenn Du mal aus dem Quellcode ein "Ä" ohne "connection setting" als Unicode-String an die DB übergibst?

Lies doch mal in der API-Doku nach, was wie verlangt wird...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
pPilger
User


Anmeldungsdatum: 08.02.2010
Beiträge: 24

BeitragVerfasst am: Di Feb 09, 2010 22:59    Titel: Antworten mit Zitat

Hyperion hat folgendes geschrieben:

Und wenn Du mal aus dem Quellcode ein "Ä" ohne "connection setting" als Unicode-String an die DB übergibst?


Also du meinst so: u'\xc4' ?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Hyperion
User


Anmeldungsdatum: 04.08.2006
Beiträge: 2080
Wohnort: Clausthal

BeitragVerfasst am: Mi Feb 10, 2010 09:41    Titel: Antworten mit Zitat

pPilger hat folgendes geschrieben:
Hyperion hat folgendes geschrieben:

Und wenn Du mal aus dem Quellcode ein "Ä" ohne "connection setting" als Unicode-String an die DB übergibst?


Also du meinst so: u'\xc4' ?

Nein, ich meine
Code: (Python)
1
2
3

u"ä"

Natürlich muss das Encoding der Script-Datei Umlaute unterstützen (also z.B. utf-Cool und korrekt angegeben und auch exakt in dem encoding gespeichert sein.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
pPilger
User


Anmeldungsdatum: 08.02.2010
Beiträge: 24

BeitragVerfasst am: Do Feb 11, 2010 11:33    Titel: Antworten mit Zitat

Danke für Deine Geduld:
Zitat:

Nein, ich meine
Code: (Python)
1
2
3

u"ä"

Natürlich muss das Encoding der Script-Datei Umlaute unterstützen (also z.B. utf-Cool und korrekt angegeben und auch exakt in dem encoding gespeichert sein.


Dann erhalte ich folgende Meldung:
'ascii' codec can't encode character u'\xc4' in position 128: ordinal not in range(128)

das script ist auf utf-8 eingestellt.
Ich vermute der Fehler kommt von Python und nicht von kinterbas!? Oder lieg' ich da falsch.
Grüße
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Hyperion
User


Anmeldungsdatum: 04.08.2006
Beiträge: 2080
Wohnort: Clausthal

BeitragVerfasst am: Do Feb 11, 2010 11:44    Titel: Antworten mit Zitat

pPilger hat folgendes geschrieben:

Dann erhalte ich folgende Meldung:
'ascii' codec can't encode character u'\xc4' in position 128: ordinal not in range(128)

Das bringt uns doch schon mal weiter. Irgend wo will jetzt (vermutlich das Modul zur Datenbank) jemand den Unicode-String in einen Byte-String umwandeln (was prinzipiell ja auch so sein muss). Dafür will die Funktion aber ASCII verwenden, was ja nun einmal keine Umlaute usw. kennt. Du musst also irgend wie das Encoding der DB umstellen, da ASCII wohl augenscheinlich der Default ist.

Was uns zurück zur Dokumentation des Moduls bringt...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
pPilger
User


Anmeldungsdatum: 08.02.2010
Beiträge: 24

BeitragVerfasst am: Do Feb 11, 2010 12:17    Titel: Antworten mit Zitat

Hyperion hat folgendes geschrieben:
pPilger hat folgendes geschrieben:

Dann erhalte ich folgende Meldung:
'ascii' codec can't encode character u'\xc4' in position 128: ordinal not in range(128)

Was uns zurück zur Dokumentation des Moduls bringt...


OK, ich gebe jetzt beim db_connect das Char_Set mit an und kann nun auch Umlaute speichern.

Folgendes Problem habe ich aber noch.
Hole ich Daten z.B. mit diesem Wort aus der db:"Äther"
Dann wird bei meiner kontrollausgabe mit print eine eins drangehängt:
Äther 1
Die wandert auch mit in die DB. Woher kommt die und wie krieg ich sie wieder los?
In den "Rohdaten" sieht das so aus: u'\xc4ther 1'

Grüße
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Hyperion
User


Anmeldungsdatum: 04.08.2006
Beiträge: 2080
Wohnort: Clausthal

BeitragVerfasst am: Do Feb 11, 2010 12:18    Titel: Antworten mit Zitat

pPilger hat folgendes geschrieben:

Hole ich Daten z.B. mit diesem Wort aus der db:"Äther"
Dann wird bei meiner kontrollausgabe mit print eine eins drangehängt:
Äther 1

Ist das nur bei Umlauten? Steht die "1" wirklich nicht schon in der DB drin?
Ohne Code-Beispiel geht hier gar nichts.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
pPilger
User


Anmeldungsdatum: 08.02.2010
Beiträge: 24

BeitragVerfasst am: Do Feb 11, 2010 13:24    Titel: Antworten mit Zitat

[quote="Hyperion"]
pPilger hat folgendes geschrieben:

Ist das nur bei Umlauten? Steht die "1" wirklich nicht schon in der DB drin?


Sorry, der Wald vor lauter Bäumen..-))

Den nächsten hatte ich hier:
x = x.replace("Ä", "&Auml;")

Aber jetzt weis ich ja, dass ich u"Ä" notieren muss.

Nochmals vielen Dank!!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche Python-Forum Foren-Übersicht -> Datenbankprogrammierung mit Python Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
using CodeBB 1.1