25

我不知道 Ruby 但想运行一个脚本,其中:

D:/Heather/Ruby/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:45:in `require': 无法加载此类文件 -- iconv (LoadError)

如果我评论 iconv 代码,它会以某种方式工作,但如果我可以重新编码这部分会更好:

return Iconv.iconv('UTF-8//IGNORE', 'UTF-8', (s + ' ') ).first[0..-2]

没有iconv。也许我可以String#encode在这里以某种方式使用?

4

4 回答 4

39

Iconv 在 1.9.3 中被弃用(删除)。你仍然可以安装它。

如果您不确定,请参考资料: https ://rvm.io/packages/iconv/

但是,建议您不要而是使用:

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

API

于 2013-04-16T08:39:05.253 回答
9

从 Ruby 2.1 开始可以使用String#scrub 。

str.scrub(''),
str.scrub{ |bytes| '' }

相关问题:Ruby 1.9.X 中 Iconv.conv(“UTF-8//IGNORE”,…) 的等价物?

于 2013-06-08T09:24:06.560 回答
8

如果您不在 Ruby 2.1 上,因此无法使用String#scrub,则以下内容将忽略字符串中未正确 UTF-8 编码的所有部分。

string.encode('UTF-16', :invalid => :replace, :replace => '').encode('UTF-8')

encode 方法几乎完全符合您的要求,但需要注意的是,如果它认为字符串已经是 UTF-8,则 encode 不会做任何事情。因此,您需要更改编码,通过仍然可以编码 UTF-8 可以编码的完整 unicode 字符集的编码。(如果你不这样做,你会破坏任何不在该编码中的字符 - 7bit ASCII 将是一个非常糟糕的选择!)

于 2014-01-23T17:43:43.873 回答
0

我对单独使用一行 string.encode 的各种方法并不满意

但我写了一个回填,在 MRI pre 2.1 或其他没有它的红宝石中实现 String#scrub。

https://github.com/jrochkind/scrub_rb

于 2014-10-29T02:24:40.793 回答