Java问题编写Multi-VCard

时间:2016-11-11 09:25:58

标签: java encoding filewriter vcard

美好的一天

我正在尝试将地址簿导出到单个多卡中,以便与Gigaset N520-IP Pro一起使用

以下是我在Gigaset手机中创建的一个示例条目,并使用webgui导出功能将其导出:

  

开始:VCARD
版本:2.1
左:Bob; Bobbington
  TEL; HOME:00412345689
TEL; WORK:00419876543
  TEL; CELL:004112345432
结束:VCARD

     

开始:VCARD
版本:2.1
N:NotBob; NotBobbington
  TEL; HOME:00412345689
TEL; WORK:00419876543
  TEL; CELL:004112345432
结束:VCARD

     

BEGIN:VCARD ....

我将此作为模板用于生成导入所需的特定VCard,但每当我尝试导入它时,它只接受整个vcard作为一个Person,即使其中有20个条目。

我的参赛作品如下:

  

开始:VCARD
版本:2.1
N:Max; Mustermann
  TEL; HOME:00411234578
TEL; WORK:00411234567
  TEL; CELL:00411234590
结束:VCARD

     

开始:VCARD
版本:2.1左:MHUEUEx; MusterHEHEmann
  TEL; HOME:00411234578
TEL; WORK:00411234567
  TEL; CELL:00411234590
结束:VCARD

我无法看到我和导出的vcard之间的视觉差异。

如果我将我的条目复制到另一张vcard中,它会立即停止工作。

但是,如果我复制工作vcard中的现有条目,则vcard仍然有效。

我想我对整个文件都有一些编码问题。

我还检查了VCard Wiki网站是否存在我的错误,并尝试了一些修复。

我试过了:
SafeCharing仅将所有字符串分配到字母(a-z&& A-Z)(数字除外)
临时用00替换数字中的+ 仅将VCARD字符串减少为ASCII 使用不同的行分隔符(“\ n,\ r \ n”,System.lineSeparator())

系统数据:
操作系统:Centos 6.8(最终)
Java版本:1.8.0_102-b14(x64)

现在,这是我的实际代码:

    //Code for Address book fetching would be here
        log.debug("Received : " + Addressbook.size());

    File ExportFile = new File(ExportFilePath);

    if(ExportFile.exists())
    {
        ExportFile.delete();
    }
    ExportFile.createNewFile();

    log.debug("Writing VCards to File: " + ExportFile.getAbsolutePath());

    FileWriter FW = new FileWriter(ExportFile);

    Map<String, DataEntry> Properties = null;

    String homephone="";
    String phone="";
    String mobile="";
    String firstname="";
    String lastname="";

    StringBuilder SB = null;
    String Fix="";

    for(AddressbookContact AC : Addressbook)
    {
        log.debug("Writing: " + AC.getName());
        Properties = AC.getContactProperties();

        SB = new StringBuilder();

        SB.append("BEGIN:VCARD");
        SB.append(System.lineSeparator());
        SB.append("VERSION:2.1");
        SB.append(System.lineSeparator());

        firstname=NameFilter(AC.getFirstname());
        lastname=NameFilter(AC.getFamilyname());

        SB.append("N:"+firstname+";"+lastname);
        SB.append(System.lineSeparator());

        homephone= Properties.get("homephone").getValue();
        log.debug("Homephone: " + homephone);

        if(homephone.startsWith("+")) //Test only, to exlucde existing + as an errorsource
        {
            //TODO: If + was source of error, write proper regex replace function
            homephone="00"+homephone.substring(1, homephone.length());
        }
        log.debug("Filtered: " + homephone);

        phone = Properties.get("phone").getValue();
        log.debug("Phone: " + phone);

        if(phone.startsWith("+"))
        {
            phone="00"+phone.substring(1, phone.length());
        }

        log.debug("Filtered: " +phone);

        mobile= Properties.get("mobile").getValue();
        log.debug("Mobile: " + mobile);


        if(mobile.startsWith("+"))
        {
            mobile ="00"+mobile.substring(1, mobile.length());
        }

        log.debug("Filtered: " + mobile);

        if(!homephone.isEmpty())
        {
            SB.append("TEL;HOME:"+homephone);
            SB.append(System.lineSeparator());
        }

        if(!phone.isEmpty())
        {
            SB.append("TEL;WORK:"+phone);
            SB.append(System.lineSeparator());
        }

        if(!mobile.isEmpty())
        {

            SB.append("TEL;CELL:"+mobile);
            SB.append(System.lineSeparator());
        }

        SB.append("END:VCARD");
        SB.append(System.lineSeparator());
        SB.append(System.lineSeparator());
        Fix = SB.toString();
        Fix = Fix.replaceAll("[^\\u0000-\\uFFFF]", ""); //ASCII only
        FW.write(Fix);
    }

    log.debug("Done!");

    FW.close();
}

String NameFilter(String Entry)
{
    String safeChar="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVXYZ";
    char[] allowed = safeChar.toCharArray();
    char[] charArray = Entry.toCharArray();
    StringBuilder Result = new StringBuilder();
    for (char c : charArray)
    {
        for (char a : allowed)
        {
            if(c==a) Result.append(a);
        }
    }
    return Result.toString();
}

我如何调试此类问题?

真诚的Fabian95qw

2 个答案:

答案 0 :(得分:0)

删除vCards之间的空行。

答案 1 :(得分:0)

我明白了,看到的导出VCard从未与实际的vcard版本2.1一致

所以我尝试使用ezvcard生成一个multivcard。现在完全vcard版本2.1符合multivcard工作。

    log.debug("Writing VCards to File: " + ExportFile.getAbsolutePath());
    FileWriter FW = new FileWriter(ExportFile);
    VCardWriter VCW = new VCardWriter(FW, VCardVersion.V2_1);
    VCard VC = null;
    StructuredName SN = null;
    Telephone T = null;


    Map<String, DataEntry> Properties = null;

    String homephone="";
    String phone="";
    String mobile="";
    String firstname="";
    String lastname="";     

    for(AddressbookContact AC : Addressbook)
    {
        log.debug("Writing: " + AC.getName());
        Properties = AC.getContactProperties();

        firstname=NameFilter(AC.getFirstname());
        lastname=NameFilter(AC.getFamilyname());

        if(firstname.isEmpty() && lastname.isEmpty())
        {
            firstname = AC.getCompany();
        }

        VC = new VCard();
        SN = new StructuredName();

        SN.setFamily(lastname);
        SN.setGiven(firstname);

        VC.setStructuredName(SN);

        homephone= Properties.get("homephone").getValue();      
        phone = Properties.get("phone").getValue();
        mobile= Properties.get("mobile").getValue();


        if(!homephone.isEmpty())
        {

            T = new Telephone(homephone);
            T.addType(TelephoneType.HOME);
            VC.addTelephoneNumber(T);
        }

        if(!phone.isEmpty())
        {
            T = new Telephone(phone);
            T.addType(TelephoneType.WORK);
            VC.addTelephoneNumber(T);
        }

        if(!mobile.isEmpty())
        {

            T = new Telephone(mobile);
            T.addType(TelephoneType.CELL);
            VC.addTelephoneNumber(T);
        }

        VCW.write(VC);
    }
VCW.close();

VCard文件看起来像这样:

  

BEGIN:VCARD
  版本:2.1
  N:Testinator; Testinator ;;;
  TEL; WORK:101
  X-PRODID:ezvcard 0.9.0
  END:VCARD
  BEGIN:VCARD
  版本:2.1
  N:管理员;测试;;;
  TEL; WORK:100
  X-PRODID:ezvcard 0.9.0
  END:VCARD

〜问题已解决

诚恳

Fabian95qw