5

次のエラーが発生します。

Vpim::InvalidEncodingError (email@email.net):
2011-06-07T01:37:06+00:00 app[web.1]:   .bundle/gems/ruby/1.8/gems/vpim-0.695/lib/vpim/field.rb:110:in `decode0'

他のvcardでも問題なく動作しました。そして、データは正しく見えます-それは電子メールでなければなりません:

これは、電子メールがあるときに爆発するサンプルvcardです...それを修正するために私が行ったことは、2番目の電子メールを手動で削除することですが、それは苦痛です。

BEGIN:VCARD
VERSION:2.1
N:Roberts;Paul;;;
FN:Paul Roberts
ORG:Sonoma Technology Inc
TITLE:EVP Business Dev/Chief Scientific Officer
TEL;WORK;VOICE:707-665-9900
TEL;WORK;FAX:707-665-9800
ADR;WORK;ENCODING=QUOTED-PRINTABLE:;;1455 N McDowell Blvd Suite D;Petaluma;CA;94954;USA
LABEL;WORK;ENCODING=QUOTED-PRINTABLE:1455 N McDowell Blvd Suite D=0D=0APetaluma, CA 94954=0D=0AUSA
URL:http://www.sonomatech.com
URL:http://www.sonomatech.com
EMAIL;PREF;INTERNET:paul@sonomatech.com
paul@sonomatech.com
NOTE;ENCODING=QUOTED-PRINTABLE:=0D=0A Data provided by Lead411,  http://www.lead411.com/=0D=0A =0D=0A
END:VCARD

これがペーパークリップとvpimを使用した私のコントローラーです。

 68      unless @contact.vcard.path.blank?
 69 
 70        paperclip_vcard = File.new(@contact.vcard.path)
 71 
 72       # try to scrub the vcard
 73        scrub_vcf(paperclip_vcard)
 74 
 75        @vcard = Vpim::Vcard.decode(paperclip_vcard).first
 76        @contact.title = @vcard.title
 77        @contact.email = @vcard.email
 78        @contact.first_name = @vcard.name.given
 79        @contact.last_name = @vcard.name.family
 80        @contact.phone = @vcard.telephones[0]
 81        @contact.fax = @vcard.telephones[1]
 82 
 83        @contact.address.street1 = @vcard.address.street
 84        @contact.address.city = @vcard.address.locality
 85        @contact.address.state = @vcard.address.region
 86        @contact.address.zip = @vcard.address.postalcode
 87        @contact.company_name = @vcard.org.fetch(0)
 88 
 89     end
4

1 に答える 1

4

Vcardがどのように作成されているかを確認する必要があります。14行目の2番目の電子メールは有効なプロパティ定義ではありません。これがパーサーの失敗の原因です(手動で削除すると正常に解析されるのはそのためです)。

プロパティの定義については、Vcard 2.1仕様のセクション2で読むことができます(RTFバージョン(はるかに読みやすい)はここから入手できます)。

あなたが提供した情報から、これはデコード側のVpimの問題ではなく、Vcardの作成方法に問題があるように見えます。自分でVcardを作成している場合は、エンコードロジックを確認します。外部ソースからそれらを受け取っている場合は、不適切なプロパティ定義を取り除くためにカスタムスクラビングロジックを作成することをお勧めします。そのため、手動で削除する必要はありません。

各行の正規表現をすばやくチェックすることで、これを非常に簡単に実行できるはずです。

def scrub_vcf(vcard)
  line_arr = File.readlines(vcard)
  line_arr.delete_if { |line| line.match(/^.+\:.+$/).nil? }
  File.open(vcard, "w") do |f| 
    line_arr.each{|line| f.puts(line)}
  end
end
# use the scrubbed vcf with vpim

もちろん、これをファイルに書き戻すよりも、配列に保持する方がおそらく速いでしょう、FYI。

お役に立てば幸いです。


更新:ファイルを保持したくない場合は、ファイルの代わりにVpimがデコードできる文字列を返すことができます。

def scrub_vcf(vcard)
  line_arr = File.readlines(vcard)
  line_arr.delete_if { |line| line.match(/^.+\:.+$/).nil? }
  return line_arr.join
end
# use the scrubbed vcf with vpim #=> Vpim::Vcard.decode(scrub_vcf(vcard))

クラスにメソッドがなくなっVpim::Vcard.decodeたため、ruby1.9.xを実行しているときにStringを使用する際に問題が発生したことに注意してください。ただし、Ruby1.8.7は正常に動作します。Vpimは2008/2009以降アップグレードされていないように見えるため、ruby1.9.xで使用するためにアップグレードされていない可能性があります。Stringeach


もう一度更新: ruby 1.9.xで使用するために更新されたVpimのバージョンは次のとおりです(以前に発生した問題を正確に修正します):https ://github.com/sam-github/vpim

于 2011-06-20T16:28:34.907 に答える