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

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

Beitragvon jens » 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: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

Beitragvon Dookie » Mittwoch 17. November 2004, 22:39

Hi jens,

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


Gruß

Dookie

Code: Alles auswählen

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

Beitragvon jens » Mittwoch 17. November 2004, 22:42

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

Beitragvon jens » 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: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » 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: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

Beitragvon Dookie » 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: Alles auswählen

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

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

Beitragvon Dookie » 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: Alles auswählen

#!/usr/bin/env python
import this

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder