Замена Ruby 2.0 iconv

Я не знаю Ruby, но хочу запустить скрипт, где:

D:/Heather/Ruby/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb: 45:в 'require': не удается загрузить такой файл -- iconv (LoadError)

это работает как - то, если я комментирую код iconv, но будет намного лучше, если я смогу перекодировать эту часть:

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

без iconv. Может быть, я смогу использовать String#encode здесь как-то?

4 ответов


Iconv был устаревшим (удален) в 1.9.3. Вы все еще можете установить его.

справочный материал, если вы уверены: https://rvm.io/packages/iconv/

однако предложение заключается в том, что вы не используете и скорее используете:

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

API


строка#scrub может использоваться с Ruby 2.1.

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

вопрос: эквивалент Iconv.conv ("UTF-8//IGNORE",...) в Ruby 1.9.X?


Если вы не на Ruby 2.1, поэтому не можете использовать String#scrub затем следующее будет игнорировать все части строки, которые неправильно кодируются UTF-8.

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

метод encode делает почти точно то, что вы хотите, но с оговоркой, что encode ничего не делает, если он думает, что строка уже UTF-8. Поэтому вам нужно изменить кодировки, перейдя через кодировку, которая все еще может кодировать полный набор символов Юникода, которые может кодировать UTF-8. (Если вы этого не сделаете, вы испортите любой символы, которые не находятся в этой кодировке-7BIT ASCII, были бы действительно плохим выбором!)


Мне не повезло с различными подходами, использующими одну строку.кодирование само по себе

но я написал backfill, который реализует строку#scrub в MRI pre 2.1 или другие рубины