iconv的弃用警告与ruby1.9.3

我运行rspec时遇到了这个警告:

 /gems/activesupport-3.1.0/lib/active_support/dependencies.rb:240:in`block in require':iconv将来会被弃用,改用String#encode。

我用rails 3.1.2.rc2版本得到相同的警告。 似乎它与sqlite3gem,但我不知道。 ruby1.9.2没有警告

任何build议如何处理?

您正在获取此弃用通知,导致图书馆某处需要iconv

iconv是由Matz创build的一个gem,可以用来将string从一种格式转换为另一种格式。

例如这经常被使用:

Iconv.iconv('UTF-8//IGNORE', 'UTF-8', content)这个小小的魔法需要一个UTF-8string,可能有无效的字符,并将其转换为适当的UTF-8string。

已经决定在Ruby 1.9.3中我们不应该再使用iconv,而是使用内置的String#encode 。 encodefunction更强大,可以让你更灵活。

理论是,上面的例子可以被replace为:

string.encode("UTF-8", :invalid => :replace, :undef => :replace, :replace => "?")

实际上,这似乎是不完美的 。

对于那些希望支持1.8的gem创build者来说,这也不是一件容易的事情:

 content = RUBY_VERSION.to_f < 1.9 ? Iconv.iconv('UTF-8//IGNORE', 'UTF-8', "content") : "#{content}".encode(Encoding::UTF_8, :invalid => :replace, :undef => :replace, :replace => '') 

所以,你有一个需要iconv的地方find它:

假设您的错误消息是: /gems/activesupport-3.1.0/lib/active_support/dependencies.rb:240 : /gems/activesupport-3.1.0/lib/active_support/dependencies.rb:240

在第240行打开/gems/activesupport-3.1.0/lib/active_support/dependencies.rb

添加行:

 p caller if file =~ /iconv/ 

(刚才: load_dependency(file) { result = super }

你会得到一个很大的堆栈跟踪:

 耙 - 任务
 /home/sam/.rvm/gems/ruby-1.9.3-p125/gems/activesupport-3.2.6/lib/active_support/dependencies.rb:251:in`block in require':iconv将来会被弃用,请改用String#encode。
 [“/home/sam/.rvm/gems/ruby-1.9.3-p125/gems/calais-0.0.13/lib/calais.rb:5:in`'”, 
 ..更省略..

这告诉我这是加勒gem。 通过拉请求,我不是第一个 。 拉没有被拉进去。


根据gem,可能会有升级版本没有这个错误,所以我build议你先升级你的gem。 如果你不走运,你可能会陷入一个不幸的任务,就是为了摆脱这个问题(例如,如果你要求解决这个问题的话,它就会失败)

如果你看到这个,很可能不是 Rails。 如果您查看发布的错误中引用的行的方法,您将看到以下内容:

 def require(file, *) result = false load_dependency(file) { result = super } result end 

我不是说这是你的代码,但是我确定这不是iconv被调用的问题。 就我而言,我发现我的项目代码实际上包含了对iconv的引用。

如果你想检查你的代码的这种参考,请尝试在您的项目目录中的grep -ir iconv ./

iconv实际上在图书馆中时,可能很难find。 通过暂时将上述方法更改为:

 def require(file, *) result = false puts puts caller.reverse load_dependency(file) { result = super } result end 

然后,您可以轻松地运行您的代码,并通过回溯相关线路来查找警告的根本原因。

 ruby your/code.rb 2>&1 | grep -B 5 iconv 

将其添加到程序的开始处:

 oldverb = $VERBOSE; $VERBOSE = nil require 'iconv' $VERBOSE = oldverb 

并诅咒那些认为这是专业处理贬值的人。

您可以通过为ActiveSupport :: Deprecation生成exception而不是仅打印到日志来确定警告的确切位置。 在application.rb的顶部:

 ActiveSupport::Deprecation.behavior = Proc.new do |message, backtrace| raise message end 

一旦你找出警告来自哪里(通过检查完整的回溯),再次删除。

要删除此警告…

进入你的.rvm目录并findiconv.c (我的目录是~/.rvm/src/ruby-1.9.3-p125/ext/iconv/iconv.c

编辑该文件是删除或注释掉warn_deprecated()的调用(应该在底部附近)

从该文件的目录中运行ruby extconf.rb然后make install

应该做的伎俩