Замена Ruby 2.0 iconv
Я не знаю Ruby, но хочу запустить script где:
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
?
Ответы
Ответ 1
Iconv был устаревшим (удаленным) в 1.9.3.
Вы все еще можете установить его.
Справочный материал, если вы не уверены:
https://rvm.io/packages/iconv/
Однако предложение состоит в том, что вы не используете и скорее используете:
string.encode("UTF-8", :invalid => :replace, :undef => :replace, :replace => "?")
API
Ответ 2
String # scrub можно использовать с Ruby 2.1.
str.scrub(''),
str.scrub{ |bytes| '' }
Связанный вопрос: Эквивалент Iconv.conv( "UTF-8//IGNORE" ,...) в Ruby 1.9.X?
Ответ 3
Если вы не используете Ruby 2.1, поэтому не можете использовать String#scrub
, тогда следующее будет игнорировать все части строки, которые неправильно кодируются UTF-8.
string.encode('UTF-16', :invalid => :replace, :replace => '').encode('UTF-8')
Метод кодирования делает почти то, что вы хотите, но с предостережением, которое кодирует, ничего не делает, если он считает, что строка уже является UTF-8. Поэтому вам нужно изменить кодировку, пройдя через кодировку, которая все еще может кодировать полный набор символов Unicode, которые UTF-8 может кодировать. (Если вы этого не сделаете, вы повредите любые символы, которые не находятся в этой кодировке, - 7-битный ASCII был бы очень плохим выбором!)
Ответ 4
Мне не повезло с различными подходами, используя одну строку string.encode сам по себе
Но я написал обратную засыпку, которая реализует скрап String # в MRI pre 2.1 или другие рубины, которые его не имеют.
https://github.com/jrochkind/scrub_rb