Vpim::Vcard - 解析 vcard 2.1

Posted

技术标签:

【中文标题】Vpim::Vcard - 解析 vcard 2.1【英文标题】:Vpim::Vcard - Parsing vcard 2.1 【发布时间】:2011-03-26 20:56:13 【问题描述】:

我的代码必须解析 Vcard 2.1 格式。 我正在使用 vpim(没有其他库)

当我运行Vpim::Vcard.decode(data) 时出现错误:

undefined method `each' for #<String:0x0000000928e778>

堆栈跟踪:

  NoMethodError (undefined method `each' for #<String:0x0000000928e778>):
    vpim (0.695) lib/vpim/rfc2425.rb:82:in `unfold'
    vpim (0.695) lib/vpim/rfc2425.rb:308:in `decode'
    vpim (0.695) lib/vpim/vcard.rb:692:in `decode'
    app/models/event.rb:71:in `block (2 levels) in parse_data'

我尝试在 RailsApp 初始化后运行 gem install vcard 并要求 'vcard' 目录(config.gem 在 vpim gem 之后不包含此文件)。(config.gem 'vpim' 包含在 environment.rb 中) 通过这种方式,我得到另一个错误:

;=D0=9D=D0=B0=D0=B4=D1=80=D0=B0=20=D0=B1=D0=B0=D0=BD=D0=BA=20=D0=BE=D0=BB=

(异常类为Vpim::InvalidEncodingError

我尝试解析的 Vcard 代码:

BEGIN:VCARD
VERSION:2.1
REV:20090710T151929Z
TEL;CELL:80954130722
X-CLASS:private
END:VCARD

有趣的是,第二个错误发生在我在 Rails 模型中解码时。 当我尝试直接从脚本/控制台解码时(在 installinv vcard gem 和直接包括'vcard'之后)我成功地获得了 Vcard 对象。

堆栈跟踪:

   Vpim::InvalidEncodingError (;=D0=9D=D0=B0=D0=B4=D1=80=D0=B0=20=D0=B1=D0=B0=D0=BD=D0=BA=20=D0=BE=D0=BB=):
     vcard (0.1.1) lib/vcard/field.rb:106:in `decode0'
     vcard (0.1.1) lib/vcard/field.rb:172:in `initialize'
     vcard (0.1.1) lib/vcard/field.rb:183:in `new'
     vcard (0.1.1) lib/vcard/field.rb:183:in `decode'
     vcard (0.1.1) lib/vcard/rfc2425.rb:308:in `block in decode'
     vcard (0.1.1) lib/vcard/rfc2425.rb:308:in `collect'
     vcard (0.1.1) lib/vcard/rfc2425.rb:308:in `decode'
     vcard (0.1.1) lib/vcard/vcard.rb:686:in `decode'
     app/models/event.rb:71:in `block (2 levels) in parse_data'

app/models/event.rb:71 :

vcard = Vpim::Vcard.decode(contact.text)

这是来自 irb 的示例:

95-25-164-74:~ smix$ irb
ruby-1.9.2-rc2 > str = <<EOS
ruby-1.9.2-rc2"> BEGIN:VCARD
ruby-1.9.2-rc2"> VERSION:2.1
ruby-1.9.2-rc2"> REV:20090710T151929Z
ruby-1.9.2-rc2"> TEL;CELL:80954130722
ruby-1.9.2-rc2"> X-CLASS:private
ruby-1.9.2-rc2"> END:VCARD
ruby-1.9.2-rc2"> EOS
 => "BEGIN:VCARD\nVERSION:2.1\nREV:20090710T151929Z\nTEL;CELL:80954130722\nX-CLASS:private\nEND:VCARD\n" 
ruby-1.9.2-rc2 > require 'vpim'
 => true 
ruby-1.9.2-rc2 > Vpim::Vcard.decode str
NoMethodError: undefined method `each' for #<String:0x000001010e0428>
    from /Users/smix/.rvm/gems/ruby-1.9.2-rc2/gems/vpim-0.695/lib/vpim/rfc2425.rb:82:in `unfold'
    from /Users/smix/.rvm/gems/ruby-1.9.2-rc2/gems/vpim-0.695/lib/vpim/rfc2425.rb:308:in `decode'
    from /Users/smix/.rvm/gems/ruby-1.9.2-rc2/gems/vpim-0.695/lib/vpim/vcard.rb:692:in `decode'
    from (irb):10
    from /Users/smix/.rvm/rubies/ruby-1.9.2-rc2/bin/irb:17:in `<main>'
ruby-1.9.2-rc2 > 

如何在 rails 中解析 Vcard 2.1?

【问题讨论】:

你能发布更多你的代码吗?您是否尝试解析 io 对象而不是字符串?您使用的是哪个 ruby​​ 版本? 你能发布完整的堆栈跟踪吗? 【参考方案1】:

问题是 String#each 已在 Ruby 1.9.1 中删除。 (它的功能在String#each_line 中得以保留)。要修复/解决此错误,请执行以下任一操作:

在 Ruby 1.8.7 上运行您的 rails 应用程序。 您可以编辑Vpim 代码以适当地使用String#each_line(并向vpim 作者发送补丁)

您可以通过定义 each 方法来猴子修补 String

class String
  alias_method :each, :each_line
end

切换到 vcard gem,它取自 Vpim,支持 Ruby 1.9.1。

我推荐第四个选项。

【讨论】:

gem 'vpim', git: 'https://github.com/thoughtafter/vpim.git' 为我解决了问题。有些人已经为 ruby​​ 1.9 打了补丁。

以上是关于Vpim::Vcard - 解析 vcard 2.1的主要内容,如果未能解决你的问题,请参考以下文章

如何将 VCard 解析为 Python 字典?

在 Windows 中使用 vCard 进行 UTF8 编码

hcard(vcard)2列样式

如何将vcard通讯录导入苹果手机?

在哪里可以找到读取 vcard 文件的 java 库? [关闭]

无法使用 VCard 表示创建人