【问题标题】:Ruby 2.0 iconv replacementRuby 2.0 iconv 替换
【发布时间】:2013-04-16 08:30:49
【问题描述】:

我不了解 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

【问题讨论】:

标签: ruby ruby-2.0


【解决方案1】:

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

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

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

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

API

【讨论】:

  • "deprecated (removed)" - 哈哈,这两个词的意思完全不同。
  • The Iconv page on APIdock 还说它已被弃用:“即使依赖于实现的某些扩展 [原文] 有用,也不要在库和脚本中使用这些扩展 [原文] 来广泛分发。如果你要使用这些功能,请使用 String#encode。”
【解决方案2】:

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

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

相关问题:Equivalent of Iconv.conv(“UTF-8//IGNORE”,…) in Ruby 1.9.X?

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

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

      https://github.com/jrochkind/scrub_rb

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-09
        • 2011-09-04
        • 1970-01-01
        相关资源
        最近更新 更多