Seite 1 von 1

CHARSET=ISO-8859-1;ENCODING=QUOTED-PRINTABLE:=0AA=E4=

Verfasst: Mittwoch 17. November 2004, 21:58
von jens
Ich bin ja ein vCard Editor am basteln... Nun muß ich mich mit CharSet rumschlagen und hab keine Ahnung :oops:

Also ein Eintrag in der vCard hat z.B.:

Code: Alles auswählen

CHARSET=ISO-8859-1
ENCODING=QUOTED-PRINTABLE
Dabei habe ich folgende Test-String:

Code: Alles auswählen

=0AEnter=0AA=E4=
=C4O=F6=D6U=FC=DC=20
Diese String müße genau das ergeben:

Code: Alles auswählen

Enter
AäÄOöÖUüÜ

So, nun zu meiner Frage... Es gibt ja encode() und decode()... Wie wende ich diese richtig an?

Verfasst: Mittwoch 17. November 2004, 22:09
von jens
Ah, ein bischen gesucht und schon was gefunden und was gebastelt:

Code: Alles auswählen

TestString="""=0AEnter=0AA=E4=
=C4O=F6=D6U=FC=DC=20"""

Codec = "ISO-8859-1"
print TestString.encode(Codec)
print
print TestString.decode(Codec)
Allerdings ist der Codec nicht richtig... Folgende bringen auch nichts:
latin_1
iso8859_1
idna

Verfasst: Mittwoch 17. November 2004, 22:39
von Dookie
Hi jens,

tja, da würde ich spontan mal den "quopri_codec" versuchen ;)


Gruß

Dookie

Verfasst: Mittwoch 17. November 2004, 22:42
von jens
Dookie du bist Gott :lol: Danke!

Verfasst: Mittwoch 17. November 2004, 22:57
von jens
Und leider Sitze ich schon vor dem nächsten Problem... Zeilenumbrüche ;(

Code: Alles auswählen

NOTE:Notiz!
URL:www.%.de
LABEL;CHARSET=ISO-8859-1;ENCODING=QUOTED-PRINTABLE:Stasse 5=0AEnter=0AA=E4=
=C4O=F6=D6U=FC=DC=20
END:VCARD
Hier ist der LABEL Eintrag über zwei Zeilen... Ich nehme an, weil das Handy automatisch Zeilenumbrüche bei zulangen Zeilen einfügt... Diese muß ich nun rausfiltern...

Ich denke vielleicht geht es mit re... Denn wenn ich das richtig sehe, gehöhren alle Zeilen, in dem kein ":" vorkommt zusammen... Besser gesagt:
Zwischen dem Bezeichner und dem Wert ist immer ein ":"... Sollte in der nächsten zeile kein ":" vorkommen, muß der Umbruch weg...

Verfasst: Mittwoch 17. November 2004, 23:26
von jens
Da Fällt mir gerade ein bessere Beispiel ein, denn so hab ich die Daten vorliegen:

Code: Alles auswählen

A:1\nB:2\n3\nC:4
Raus kommen soll:

Code: Alles auswählen

A:1\nB:23\nC:4

Mit re. sollte es doch irgendwie gehen... Ich bastel gerade an einer IF Version rum und brech mir einen ab :)

Verfasst: Mittwoch 17. November 2004, 23:39
von jens
So, hab nun eine Umständliche Variante:

Code: Alles auswählen

def DateiInhaltParsen(vCard):
    Lines = vCard.split("\n")

    ItemsListe = []
    for l in Lines:
        if l!="":
            ItemsListe.append( l.split(":",1) )

    for i in xrange( len(ItemsListe) ):
        if len(ItemsListe[i])==1:
            ItemsListe[i-1][1] = str(ItemsListe[i-1][1]) + ItemsListe[i][0]

    ItemsListeNeu = []
    for i in ItemsListe:
        if len(i)==2:
            ItemsListeNeu.append(i)

    return ItemsListeNeu

Code: Alles auswählen

TestString="A:1\nB:2\n3\nC:4"
print TestString
print "="*30
print DateiInhaltParsen(TestString)
Ergebnis:

Code: Alles auswählen

A:1
B:2
3
C:4
==============================
[['A', '1'], ['B', '23'], ['C', '4']]

Das ganze funktioniert aber schon nicht, wenn der Werte-Bereich über mehr als zwei Zeilen geht, aber das kommt, denke ich, nicht vor...

Verfasst: Mittwoch 17. November 2004, 23:55
von Dookie
Hi jens,

Code: Alles auswählen

re.sub(r'\n(([^:]+)\n)', r"\1", test )
löscht die ungewünschten "\n" weg.

Gruß

Dookie

Verfasst: Donnerstag 18. November 2004, 00:05
von jens
Danke, das klappt... Zwar auch nur bei zwei zeilen, aber das dürfte ja reichen...

Nun hab ich nochmal eine Frage zum encoding... Ich hab ja die "Markierung" "CHARSET=3DISO-8859-1;ENCODING=3DQUOTED-PRINTABLE"... Wenn ich nun einen String konvertiere und die "Markierung" lösche, weiß ich natürlich nicht mehr ob der String auch wieder zurück konvertiert werden muß...

Nun könnte man Testen, ob eine Konvertierung sich überhaupt lohnt:

Code: Alles auswählen

Text="Kein Sonderzeichen"
print Text.encode("quopri_codec") == Text

Text="Ein Sonderzeichen: ä"
print Text.encode("quopri_codec") == Text
Das dumme ist nur, das beide zeilen ein False raus geben, weil Leerzeichen auch nach =20 Konvertiert werden... Das ist allerdings in den vCard-Dateien nicht der Fall :(

Kann man den "quopri_codec" manipulieren??? Ansonsten mache ich halt einfach nochmal ein replace("=20"," ")...

Verfasst: Donnerstag 18. November 2004, 00:53
von Dookie

Code: Alles auswählen

regex = re.compile(r'\n(([^:]+)\n)')
result = test
while regex.findall(result):
    result = regex.sub(r"\1", result)
löscht auch mehrere Linefeeds.

Beim rumspielen mit dem codec ist mir was aufgefallen, '\n' die gelöscht werden können haben immer ein '=' davor. Also reicht ein:

Code: Alles auswählen

test = test.replace('=\n', '')
um die ungewünschten '\n' zu eliminieren.
Alternativ kannst Du auch den ganzen String vor dem parsen und zerlegen decodieren, dann werden die überflüssigen Linefeeds auch gelöscht.

Du kannst auch direkt den String darauf testen ob zu quotende Zeichen darin vorkommen

Code: Alles auswählen

if '=' in test or ord(max(test)) >= 0x7f or ord(min(test)) <= 0x20:
    print "test muss gequotet werden!"
geht sicher schneller als die strings erst zu quoten und dann zu vergleichen.


Gruß

Dookie