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

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
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 17. November 2004, 21:58

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?
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 17. November 2004, 22:09

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
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Mittwoch 17. November 2004, 22:39

Hi jens,

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


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 17. November 2004, 22:42

Dookie du bist Gott :lol: Danke!
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 17. November 2004, 22:57

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...
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 17. November 2004, 23:26

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 :)
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 17. November 2004, 23:39

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...
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Mittwoch 17. November 2004, 23:55

Hi jens,

Code: Alles auswählen

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

Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 18. November 2004, 00:05

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"," ")...
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Donnerstag 18. November 2004, 00:53

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
[code]#!/usr/bin/env python
import this[/code]
Antworten