Seite 1 von 1

UTF-8 mit MySQL ... Sonderzeichen sind falsch

Verfasst: Montag 15. März 2010, 16:30
von gmconsult

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()


Verfasst: Montag 15. März 2010, 18:04
von Defnull
Und du glaubst, das du auf sowas eine Antwort bekommst?

Verfasst: Montag 15. März 2010, 18:08
von cofi
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.

Besser so

Verfasst: Montag 15. März 2010, 18:23
von gmconsult
Die DB besteht nur aus der einen tabelle...

Alles ist auf UTF-8 gestellt bis auf die id = int(12) autoinc[/code]

Verfasst: Montag 15. März 2010, 18:34
von EyDu
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

sorry bin kein python coder

Verfasst: Montag 15. März 2010, 19:08
von gmconsult
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

Re: sorry bin kein python coder

Verfasst: Montag 15. März 2010, 19:20
von Hyperion
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.

Verfasst: Montag 15. März 2010, 20:23
von gmconsult
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

Verfasst: Montag 15. März 2010, 20:26
von gmconsult
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

Verfasst: Montag 15. März 2010, 20:28
von Hyperion
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?

Verfasst: Montag 15. März 2010, 20:29
von gmconsult
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

Verfasst: Montag 15. März 2010, 20:29
von Hyperion
gmconsult hat geschrieben: Ps.: hoffe ich hab sie nicht übersehen... aber eine edit-funktion wär recht praktisch
Gibt es ;-)

Verfasst: Montag 15. März 2010, 20:39
von gmconsult
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

Verfasst: Montag 15. März 2010, 20:45
von Hyperion
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.

Verfasst: Montag 15. März 2010, 20:49
von gmconsult
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.

Verfasst: Montag 15. März 2010, 20:54
von Leonidas
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.

Verfasst: Montag 15. März 2010, 20:59
von Hyperion
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).