From: Anders Date: 2005-12-02T06:32:31+09:00 Subject: Help getting around iconv on a PC I've just started using Ruby again, and maybe it's because it's been awhile since I've used it, but I've gotten stuck. I want to use the bloglines Webservice API. So, I downloaded and installed it as well as simple-xml, which it uses. I run a simple test: require 'webservice/bloglines' print "done!\n" Ruby chokes, saying: :/ruby/lib/ruby/site_ruby/1.8/rubygems/loadpath_manager.rb:5:in `require__': No such file to load -- iconv (LoadError) from c:/ruby/lib/ruby/site_ruby/1.8/rubygems/loadpath_manager.rb:5:in `require' from c:/ruby/lib/ruby/site_ruby/1.8/webservice/parser.rb:4 from c:/ruby/lib/ruby/site_ruby/1.8/rubygems/loadpath_manager.rb:5:in `require__' from c:/ruby/lib/ruby/site_ruby/1.8/rubygems/loadpath_manager.rb:5:in `require' from c:/ruby/lib/ruby/site_ruby/1.8/webservice/restapi.rb:7 from c:/ruby/lib/ruby/site_ruby/1.8/rubygems/loadpath_manager.rb:5:in `require__' from c:/ruby/lib/ruby/site_ruby/1.8/rubygems/loadpath_manager.rb:5:in `require' from c:/ruby/lib/ruby/site_ruby/1.8/webservice/bloglines.rb:3 from c:/ruby/lib/ruby/site_ruby/1.8/rubygems/loadpath_manager.rb:5:in `require__' from c:/ruby/lib/ruby/site_ruby/1.8/rubygems/loadpath_manager.rb:5:in `require' from test.rbw:1 As far as I can tell from looking around the web, iconv is a Unix library, and I'm on a PC running WinXP. How do I work around this? To figure out what the parser is using iconv for, I've included the code below. Any help would be greatly appreciated. Thanks, Anders Schneiderman SEIU International ------------------------------------------------------------------------------------- # $Id: parser.rb,v 1.2 2004/09/29 04:19:10 date Exp $ require 'xmlsimple' require 'iconv' # handling invalid character # Replace from invalid character to `?' # (instead of numerical character reference). # Because REXML convert numerical character reference at parsing time. class Iconv def self.fix_malformed_characters(str) iconv = Iconv.new("UTF-8", "UTF-8") out = "" begin out << iconv.iconv(str) rescue Iconv::IllegalSequence => e out << e.success ch, str = e.failed.split(//n, 2) out << if respond_to?(:unknown_unicode_handler) unknown_unicode_handler(ch) else "?" end retry end return out end end module WebService class Parser def initialize end # for REXML def fix_encoding(xml_source) xml_source.sub(/encoding="utf-8"\?>/i, 'encoding="UTF-8"?>') end def parse(xml_source) xml_source = fix_encoding(xml_source) xml_source = Iconv.fix_malformed_characters(xml_source) XmlSimple.xml_in(xml_source, { 'ForceArray' => false, 'KeepRoot' => true } ) end end end