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
Also ein Eintrag in der vCard hat z.B.:
Dabei habe ich folgende Test-String:
Diese String müße genau das ergeben:
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
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:
Raus kommen soll:
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,
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:
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