可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I don't know Ruby but want to run an script where:
D:/Heather/Ruby/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:45:in `require': cannot load such file -- iconv (LoadError)
it works somehow if I comment iconv code but it will be much better if I can recode this part:
return Iconv.iconv('UTF-8//IGNORE', 'UTF-8', (s + ' ') ).first[0..-2]
without iconv
. Maybe I can use String#encode
here somehow?
回答1:
Iconv was deprecated (removed) in 1.9.3. You can still install it.
Reference Material if you unsure: https://rvm.io/packages/iconv/
However the suggestion is that you don't and rather use:
string.encode("UTF-8", :invalid => :replace, :undef => :replace, :replace => "?")
API
回答2:
String#scrub can be used since Ruby 2.1.
str.scrub(''), str.scrub{ |bytes| '' }
Related question: Equivalent of Iconv.conv(“UTF-8//IGNORE”,…) in Ruby 1.9.X?
回答3:
If you're not on Ruby 2.1, so can't use String#scrub
then the following will ignore all parts of the string that aren't correctly UTF-8 encoded.
string.encode('UTF-16', :invalid => :replace, :replace => '').encode('UTF-8')
The encode method does almost exactly what you want, but with the caveat that encode doesn't do anything if it thinks the string is already UTF-8. So you need to change encodings, going via an encoding that can still encode the full set of unicode characters that UTF-8 can encode. (If you don't you'll corrupt any characters that aren't in that encoding - 7bit ASCII would be a really bad choice!)
回答4:
I have not had luck with the various approaches using a one line string.encode by itself
But I wrote a backfill that implements String#scrub in MRI pre 2.1, or other rubies that do not have it.
https://github.com/jrochkind/scrub_rb