gpt4 book ai didi

ruby-on-rails - 为什么在 rails 2 中使用 vpim 会出现编码错误?

转载 作者:行者123 更新时间:2023-12-04 06:17:29 36 4
gpt4 key购买 nike

我收到以下错误:

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,当有电子邮件时它会爆炸……我为修复它所做的是手动删除第二封电子邮件,但这很痛苦:
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 的 Controller :
 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

最佳答案

您需要查看您的 Vcard 是如何创建的;第 14 行的第二封电子邮件不是有效的属性定义,这就是导致解析器出错的原因(这也是如果您手动删除它会成功解析的原因)。

您可以在 the Vcard 2.1 specification 的第 2 节中阅读有关属性定义的信息。 (RTF 版本——更具可读性——可用 here)。

从您提供的信息来看,这似乎不是 Vpim 的问题。在解码方面,而是如何创建 Vcard。如果你自己创建 Vcards,我会看看你的编码逻辑。如果您从外部来源接收它们,那么您可能需要编写一些自定义清理逻辑来摆脱不正确的属性定义,因此您不必自己手动删除它们。

通过对每一行的快速正则表达式检查,您应该能够很容易地做到这一点:

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

当然,将它保存在一个数组中而不是将它写回到一个文件中可能会更快,仅供引用。

希望有帮助。

更新:如果不想保留文件,可以返回一个字符串,即 Vpim can decode而不是文件:
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 的字符串时遇到了问题。在运行 ruby​​ 1.9.x 时,由于 String类(class)不再有 each方法。不过,Ruby 1.8.7 运行良好。 Vpim 看起来自 2008/2009 年以来就没有升级过,所以它可能没有升级为与 ruby​​ 1.9.x 一起使用。

再次更新:这是一个更新的 Vpim 版本,用于 ruby​​ 1.9.x(精确地修复了我之前遇到的问题): https://github.com/sam-github/vpim

关于ruby-on-rails - 为什么在 rails 2 中使用 vpim 会出现编码错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6260294/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com