UTF-8 mit MySQL ... Sonderzeichen sind falsch

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
gmconsult
User
Beiträge: 8
Registriert: Montag 15. März 2010, 16:27

Code: Alles auswählen

import imaplib
import re
import email
import quopri
import MySQLdb
from email.header import decode_header

def strip_tags(value):
    "Return the given HTML with all tags stripped."
    return re.sub(r'<[^>]*?>', '', value) 

im = imaplib.IMAP4_SSL("xxx.xxx.xxx") 
im.login("xxx+xxx-xxxx.xxx", "xxxxxxx")

konto = 'office'

print "Vorhandene Mailboxen:" 
for mb in im.list()[1]: 
    name = mb.split("\".\"")[-1] 
    name = name.strip(" \"")
    print "%s" % name
    
    im.select(name)
    status, daten = im.search(None, "ALL") 
    for msg_id in im.search(None, 'ALL')[1][0].split(): 
        msg = email.message_from_string(im.fetch(msg_id, '(RFC822)')[1][0][1])
        
        mailenc = msg.get_content_charset()
        if mailenc is None:
            mailenc = "ISO-8859-1"
        
        FROM = str(msg['From'].decode(mailenc).encode('ISO-8859-1'))
        TO = str(msg['To'].decode(mailenc).encode('ISO-8859-1'))
        
        tmp = decode_header(msg['Subject'])
        mailenc = tmp[0][1]
        if mailenc is None:
            mailenc = "ISO-8859-1"
        SUBJECT = str(tmp[0][0].decode(mailenc).encode('ISO-8859-1'))
        
        DATE = str(msg['Date'])
        MSGID = str(msg['Message-Id'])
        tmp = ""
        if msg.is_multipart(): 
            for part in msg.get_payload():
                txtenc = part.get('content-transfer-encoding')
                mailenc = part.get_content_charset()
                if mailenc is None:
                    mailenc = "ISO-8859-1"
                
                if txtenc == "quoted-printable":
                    text = quopri.decodestring(part.get_payload())
                    text = str(text.decode('UTF-8').encode('ISO-8859-1'))
                elif txtenc == "base64":
                    text = ""
                else:
                    text = str(text.decode(mailenc).encode('ISO-8859-1'))
                
                tmp = tmp + "\n" + text
            
            text = tmp
        else:
            text = msg.get_payload(decode=True)
            text = text.decode(mailenc).encode('ISO-8859-1')
            
        conn = MySQLdb.connect("localhost", "root", "", "mailserver")
        cursor = conn.cursor()
        
        cursor.execute("SELECT id FROM mails WHERE msg_id=\"%s\"", (MSGID))
        zz = 0
        for row in cursor:
            zz = zz + 1
        
        if zz < 1:
            cursor.execute("INSERT INTO mails VALUES(\"\", %s, %s, %s, %s, %s, %s)", (MSGID, FROM, TO, DATE, SUBJECT, text))
            print "MsgID ", MSGID, " ... gespeichert \n"
        else:
            print "MsgID ", MSGID, " ... ausgelassen \n"

im.close() 
im.logout()

Zuletzt geändert von gmconsult am Montag 15. März 2010, 20:41, insgesamt 1-mal geändert.
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Und du glaubst, das du auf sowas eine Antwort bekommst?
Bottle: Micro Web Framework + Development Blog
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Defnull hat geschrieben:Und du glaubst, das du auf sowas eine Antwort bekommst?
Hast du doch hiermit 8)

Eine Frage hat der OP ebenfalls nicht gestellt auf die man sonst antworten koennte...

@OP: Damit man dir helfen kann, sind [ code ] [/ code ] Tags von noeten, wie auch eine konkrete Frage.

Und ein paar Infos zur Datenbank waeren auch nicht schlecht.
gmconsult
User
Beiträge: 8
Registriert: Montag 15. März 2010, 16:27

Die DB besteht nur aus der einen tabelle...

Alles ist auf UTF-8 gestellt bis auf die id = int(12) autoinc[/code]
Zuletzt geändert von gmconsult am Montag 15. März 2010, 20:41, insgesamt 1-mal geändert.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Jetzt fehlen nur noch eine Frage und eine vernünftige Problembeschreibung ;-) Außerdem solltest du den Code auf ein Minimalbeispiel bringen, das erhöht deine Chancen auf eine Antwort erheblich. Zumindest mir fehlt die Motivation mich durch 90 Zeilen Code zu lesen.

Sebastian
Das Leben ist wie ein Tennisball.
gmconsult
User
Beiträge: 8
Registriert: Montag 15. März 2010, 16:27

ich hab ehrlich gesagt 0 plan was ich da tue...

python ist für mich im moment der schnellste weg aber eine unmögliche sprache

aber egal...

ich hab garkeine sonderzeichen... weder utf-8 noch iso

irgendwie hab ich die kodierung zu tode konvertiert

hoffe irgendwer kann mir helfen


danke

ps: ich kenn py nun seit ca. 9h
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

gmconsult hat geschrieben:ich hab ehrlich gesagt 0 plan was ich da tue...
Dann ist es sicherlich nicht so verwunderlich für Dich, dass wir Dir hier nur schwer helfen können! (Zumal Deine beiden Einstiegspostings echt schon unverschämt waren!)
python ist für mich im moment der schnellste weg aber eine unmögliche sprache
Du widersprichst Dir selber - nutze doch eine Sprache, die Du beherrschst? Ist sicherlich sinnvoller, wenn Du nicht bereit bist die notwendige Zeit für das Erlernen der Basics zu investieren.
ich hab garkeine sonderzeichen... weder utf-8 noch iso
Sonderzeichen sind doch keine Codierungen!
irgendwie hab ich die kodierung zu tode konvertiert

hoffe irgendwer kann mir helfen
Dazu brauchen wir mehr Infos. Woher kommen Deine Daten? Was ist die genaue Fehlermeldung (copy & paste). Was machst Du mit den Daten, worein sollen die zurückfließen? Usw.
gmconsult
User
Beiträge: 8
Registriert: Montag 15. März 2010, 16:27

Ich bin halt kein besonderer Freund von py...

Leider hab ich erhebliche Probleme mit CPAN und drum fällt mit Perl flach... :(

Aber zum Problem...

160 Stück = UTF-8 ... direkt aus der DB
für folgende = webseite als utf-8
erklärlichen = webseite als iso-8859-1
Gr�Œnden = webseite als iso-8859-15


Danke
gmconsult
User
Beiträge: 8
Registriert: Montag 15. März 2010, 16:27

sorry bin unkenzentriert... wein wunder nach 48h ohne pause server einrichten

hoffe das mit den sonderzeichen ist klar... meinte weger MIT iso ider utf bekomm ich brauchbare umlaute

2) die daten bleiben in einer db... die werden nur per php durchsucht in der db... somit kann jeder intern auf alle mails von allen konten zugreifen und suchen

das ist der einzige sinn der aktion
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

gmconsult hat geschrieben:Ich bin halt kein besonderer Freund von py...
Beantwortet immer noch nicht die Frage... (und ist im eigentlichen Sinne auch irrelevant, weil Du augenscheinlich zu Python gezwungen bist)
Leider hab ich erhebliche Probleme mit CPAN und drum fällt mit Perl flach... :(
Ich kenne mich mit Perl nicht aus...
Aber zum Problem...
Ja? ... oops, das wars schon?
160 Stück = UTF-8 ... direkt aus der DB
Und womit dargestellt? Auf einer Konsole? Welches Encoding benutzt die dann ggf.? Wieso gibst Du das Encoding nicht bei der Connection mit an?
für folgende = webseite als utf-8
erklärlichen = webseite als iso-8859-1
Gr�Œnden = webseite als iso-8859-15
Ist die Darstellung AUF der Webseite (also im Browser dargestellt / im Quellcode) oder sind das Daten von einer Webseite (die Du geparst hast?)
Wieso erklärst Du das nicht ein wenig?
Danke
Dafür, dass wir weiter bohren müssen nach einer sinnvollen Problembeschreibung?
gmconsult
User
Beiträge: 8
Registriert: Montag 15. März 2010, 16:27

hab grad noch gemerkt, dass sich teilweise sowas einschleicht in die db (speziell im betreff der mail)

=?UTF-8?Q?Irmantas_Kuk=C4=97nas?=


Ps.: hoffe ich hab sie nicht übersehen... aber eine edit-funktion wär recht praktisch
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

gmconsult hat geschrieben: Ps.: hoffe ich hab sie nicht übersehen... aber eine edit-funktion wär recht praktisch
Gibt es ;-)
gmconsult
User
Beiträge: 8
Registriert: Montag 15. März 2010, 16:27

den quellotext, den php liefert kann ich leider nicht offen lagen...

fakt ist jedoch egal welches encoding ich einstelle, ich bekomm keine vernüftigen umlaute...

die db schau ich mit mit dem mysql-query-browser an...

Grüßen<BR>Jasmin ... das wäre aus der bash die mit uft-8 läuft per mysqldump

im vim sieht es so aus: \"Kop=\nieren\" w=C3=A4hlen.\n2
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Also wenn Du es im Query-Browser (phpmyadmin?) schon falsch dargestellt wird, dann würde ich mal wetten, dass es eben kein utf-8 ist! Die meisten Mailer arbeiten doch auch eher mit iso-codecs, oder wie sind da so die Erfahrungen der anderen? Insofern steht in der DB vermutlich etwas anderes. Hast Du denn mal probiert die den Dump in einem texteditor mit verschiedenen Encodings anzugucken? Evtl. bringt das Erkenntnisse.

Hast Du denn schon mal probiert ein utf-8 codiertes Posting per Hand in die DB einzutragen und dann per Python auszulesen?

Und noch einmal der Hinweis: Du kannst beim (nach?) dem Verbindungsaufbau das Encoding spezifizieren. Damit schließt Du auch diese Unsicherheitslücke von Python-Seite aus.
gmconsult
User
Beiträge: 8
Registriert: Montag 15. März 2010, 16:27

das problem ist einfach folgendes... die mails kommen von x ländern... da ist von russich bis cinesisch alles dabei...

also haben wir einige ausgangs-kodierungen... nur warum klappt die umkodierung nicht...

ein paar mils gehen mit dem einen, ein paar mit einem anderen encoding

irgendwo müsste ein logischer bug drin sein und der macht mir solche probleme.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Das nicht alle mit dem selben Codec eingelesen werden können ist ja klar, wenn die Russen KOI8-R nutzen und die Chinesen EUC-CN oder irgendein anderes Encoding nutzen sollte ja klar sein wenn man mal weiß was ein Encoding überhaupt ist.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Naja, ihr müßt ja nun mal wissen, welches encoding von wo kommt. Dann müßt ihr eben in ein Zielencoding codieren.

In Python macht man das immer über den "Umweg" Unicode, d.h. man bekommt einen Bytestring in Codierung "X", konvertiert den intern in Unicode (möglichst früh nach Erhalt des Strings) und codiert den Unicocde-String dann möglichst spät (also möglichst kurz vor dem Wegspeichern - wohin auch immer) in das Zielencoding.

Prinzipiell wird das in anderen Sprachen wohl ähnlich laufen (sofern die Unicode eingebaut haben).
Antworten