Установка iconv для Ruby 1.9.2
Для того, чтобы работать с юниксовой библиоеткой iconv, необходимо добавить её поддержку в Ruby. Оказывается, это не так тривиально. iconv — утилита UNIX (и одноимённая библиотека) для преобразования текста из одной кодировки в другую. Она также портирована под Windows. Утилита iconv конвертирует текст из одной кодировки в другую. Входная кодировка задаётся ключом -f, а выходная — ключом -t. Однако мы будем использовать библиотеку iconv не через вызов консольной команды, а через сам Ruby.Для этого нам придётся удалить Ruby, и скомпилировать его с поддержкой Iconv.
$ rvmsudo rvm package install iconv $ rvmsudo rvm package install readline $ rvmsudo rvm remove 1.9.2 $ rvmsudo rvm install 1.9.2 -C --with-iconv-dir=/usr/local/rvm/usr
Сам гем ставить не надо, в Gemfile прописывать зависимости тоже! Не делать это:
$ rvmsudo gem install iconv
т.к. мы уже вкомпилили iconv в Ruby.
Для ипользования iconv необходимо подключить его стандартным образом:
require 'iconv'
Проверяем в irb:
$ irb ruby-1.9.2-p180 :001 > require 'iconv' => true ruby-1.9.2-p180 :002 > puts Iconv.methods open iconv conv list ctlmethods charset_map allocate new superclass freeze === == <=> < <= > >= to_s included_modules include? name ancestors instance_methods public_instance_methods protected_instance_methods private_instance_methods constants const_get const_set const_defined? const_missing class_variables remove_class_variable class_variable_get class_variable_set class_variable_defined? module_exec class_exec module_eval class_eval method_defined? public_method_defined? private_method_defined? protected_method_defined? public_class_method private_class_method autoload autoload? instance_method public_instance_method nil? =~ !~ eql? hash class singleton_class clone dup initialize_dup initialize_clone taint tainted? untaint untrust untrusted? trust frozen? inspect methods singleton_methods protected_methods private_methods public_methods instance_variables instance_variable_get instance_variable_set instance_variable_defined? instance_of? kind_of? is_a? tap send public_send respond_to? respond_to_missing? extend display method public_method define_singleton_method __id__ object_id to_enum enum_for equal? ! != instance_eval instance_exec __send__ => nil
Спасибо!
Если вам помогла статья, или вы хотите поддержать мои исследования и блог - вот лучший способ сделать это:
А как же String#encode в 1.9.2? Или String.mb_chars в ActiveSupport 3.0?
String#encode возвращала мне Encoding::InvalidByteSequenceError а насчёт String.mb_chars не понял, в доке написано «This method has no description. You can help the Ruby on Rails community by adding new notes.». Что она делает, и как ей можно перекодировать строку. Хочу заметить, что мне нужно было не просто перекодировать строку, а сделать свертку. Т.е. есть символы в UTF, которых нет в ASCII (русские например), и мне надо было заменить их теми, котоыре есть. А это вовсе не тоже самое, что перевести английский текст из UTF в ASCI. Если есть другой способ, буду признателен, если вы его опишите здесь.
А почему не указываешь —with-readline-dir при компиляции?
А он и так ставится 🙂
А по какому принципу вообще указываются параметры для пакетов? В документации написано, что нужен этот параметр. И почему тогда iconv нельзя было так же опустить?
Потому, что руби надо скомпилить вместе с iconv, а вот readline по-моему можно вообще не ставить. Я его на всякий случай написал. Потом выяснилось, что iconv именно как package надо ставит, а не как gem. У вас Iconv.methods показывает методы iconv и convert, до прохождения алгоритма из статьи?