none
vCard-Datei lesen RRS feed

  • Frage

  • Hallo,

    ich habe auf meinem Smartphone eine vCard-Datei mit allen Kontakten erstellt. Nun versuche ich ein Programm zu schreiben, das mir den Inhalt der Datei anzeigt. Ich habe allerdings Probleme mit der Darstellung der Umlaute. Hier ist der Ausschnitt der vcf-Datei:

    BEGIN:VCARD
    VERSION:2.1
    N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=4E=6F=74=72=75=66;=42=65=68=C3=B6=72=64=65=6E;;;
    FN;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:=42=65=68=C3=B6=72=64=65=6E=20=4E=6F=74=72=75=66
    TEL;WORK:115
    END:VCARD
    BEGIN:VCARD
    VERSION:2.1
    N:Notruf;Feuerwehr;;;
    FN:Feuerwehr Notruf
    TEL;WORK:112
    END:VCARD
    BEGIN:VCARD
    VERSION:2.1
    N:Notruf;Polizei;;;
    FN:Polizei Notruf
    TEL;WORK:110
    END:VCARD
    

    Ich habe es mit dieser Library probiert

    https://github.com/mixerp/MixERP.Net.VCards

    und unter Verwendung folgenden Codes

            Dim vCardOpenFileDialog As New OpenFileDialog With {
                .InitialDirectory = My.Computer.FileSystem.SpecialDirectories.MyDocuments,
                .Filter = "vCard-Dateien|*.vcf",
                .DefaultExt = "vcf",
                .CheckFileExists = True,
                .CheckPathExists = True
            }
    
            If vCardOpenFileDialog.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
                Dim contents As String = File.ReadAllText(vCardOpenFileDialog.FileName, Encoding.UTF8)
                Dim vcards As IEnumerable(Of VCard) = Deserializer.GetVCards(contents)
                VcardListBox.DisplayMember = "FormattedName"
                VcardListBox.DataSource = vcards
            End If
    

    erhalte ich folgende Ausgabe:

    Eigentlich sollte in der ersten Zeile Behörden Notruf stehen. Tut es aber aus mir unerklärlichen Gründen nicht. Dabei sollte die Library mit der UTF-8 Kodierung klar kommen. Also habe ich mich auf die Suche nach einer anderen Library gemacht und habe diese gefunden:

    https://github.com/EWSoftware/PDI

    Gleiches Spiel von vorne mit diesem Code:

            Dim vCardOpenFileDialog As New OpenFileDialog With {
                .InitialDirectory = My.Computer.FileSystem.SpecialDirectories.MyDocuments,
                .Filter = "vCard-Dateien|*.vcf",
                .DefaultExt = "vcf",
                .CheckFileExists = True,
                .CheckPathExists = True
            }
    
            If vCardOpenFileDialog.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
                PDIParser.DefaultEncoding = Encoding.GetEncoding("utf-8")
                BaseProperty.DefaultEncoding = Encoding.GetEncoding("utf-8")
                Dim vcardp As New VCardParser
                vcardp.ParseFile(vCardOpenFileDialog.FileName)
                VcardListBox.DisplayMember = "FormattedName"
                VcardListBox.DataSource = vcardp.VCards
            End If
    

    Das Ergebnis sieht schon besser aus, obgleich die Umlaute nicht richtig dargestellt werden:

    Hat jemand eine Idee, woran es liegt und wie ich das Problemlösen könnte?

    Gruß,

    LBB


    Dienstag, 27. Februar 2018 20:32

Antworten

  • Hallo,

    wenn die Library das machen "sollte", dann gibt es zwei Möglichkeiten:

    1. Du verwendest die Library falsch
    2. Die Library macht nicht was sie sollte

    Zu 1. müsste die Dokumentation der Library Aufschluss geben.

    Zu 2. kannst Du den entsprechenden Code Teil aus der Library testen, da dir der Quelltext vorliegt. Mit dem Debugger (oder durch gezieltes Ansehen des Quelltext) solltest Du herausfinden können, ob der genannte Quelltext Teil überhaupt verwendet wird und ob dieser zu einem richtigen Ergebnis führen kann.


    - Gruß Florian




    Donnerstag, 1. März 2018 08:50

Alle Antworten

  • Du musst das Quoted Printable dekodieren:
    How to decode quoted-printable encoded string

    - Gruß Florian

    Mittwoch, 28. Februar 2018 08:33
  • Hallo Florian,

    danke für die Antwort. Allerdings sollte die Library von EWSoftware das bereits machen. Ich habe mir mal den Quellcode angeschaut und da ist etwas von Quoted-Printable die Rede in Zeile 332pp:

    https://github.com/EWSoftware/PDI/blob/master/Source/EWSPDIData/PDIParser/PDIParser.cs

    Gruß,

    LBB

    Mittwoch, 28. Februar 2018 19:05
  • Hallo,

    wenn die Library das machen "sollte", dann gibt es zwei Möglichkeiten:

    1. Du verwendest die Library falsch
    2. Die Library macht nicht was sie sollte

    Zu 1. müsste die Dokumentation der Library Aufschluss geben.

    Zu 2. kannst Du den entsprechenden Code Teil aus der Library testen, da dir der Quelltext vorliegt. Mit dem Debugger (oder durch gezieltes Ansehen des Quelltext) solltest Du herausfinden können, ob der genannte Quelltext Teil überhaupt verwendet wird und ob dieser zu einem richtigen Ergebnis führen kann.


    - Gruß Florian




    Donnerstag, 1. März 2018 08:50
  • Hallo Florian,

    vielen Dank für die Hinweise. Sie haben mich zur Lösung gebracht. Ich habe den Debugger verwendet, um mir die einzelnen Elemente der Auflistung anzuschauen. Dabei bin ich auf die Eigenschaft Value der Klasse FormattedName gestoßen. Die enthält den richtigen String.

    Also habe ich mir die Demos angeschaut, die der Library beiliegen und festgestellt, dass ich die Eigenschaft DisplayMember der ListBox falsch gesetzt habe. Statt "FormattedName" muss ich folgendes verwenden:

    VcardListBox.DisplayMember = "FormattedName_Value"

    Dann wird der Inhalt der vcf-Datei richtig dargestellt.

    Gruß,

    LBB

    Samstag, 3. März 2018 17:11
  • Wunderbar, freut mich das es dich zur Lösung gebracht hat.

    - Gruß Florian

    Montag, 5. März 2018 08:05