Установка iconv для Ruby 1.9.2
Для того, чтобы работать с юниксовой библиоеткой iconv, необходимо добавить её поддержку в Ruby. Оказывается, это не так тривиально. iconv — утилита UNIX (и одноимённая библиотека) для преобразования текста из одной кодировки в другую. Она также портирована под Windows. Утилита iconv конвертирует текст из одной кодировки в другую. Входная кодировка задаётся ключом -f, а выходная — ключом -t. Однако мы будем использовать библиотеку iconv не через вызов консольной команды, а через сам Ruby.Для этого нам придётся удалить Ruby, и скомпилировать его с поддержкой Iconv.
1 2 3 4 |
$ 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 прописывать зависимости тоже! Не делать это:
1 |
$ rvmsudo gem install iconv |
т.к. мы уже вкомпилили iconv в Ruby.
Для ипользования iconv необходимо подключить его стандартным образом:
1 |
require 'iconv' |
Проверяем в irb:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
$ irb ruby-1.9.2-p180 :001 > require 'iconv' => true ruby-1.9.2-p180 :002 > puts Iconv.methods open <strong>iconv</strong> <strong>conv</strong> 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, до прохождения алгоритма из статьи?