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

Anders wrote:

... 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)
...

I've put together a package to install iconv on a One-Click Ruby box here:
http://dave.burt.id.au/ruby/iconv.zip

Cheers,
Dave

Hi Anders, I haven't used iconv on windows with Ruby, but I found this
googling...

http://groups.google.com/group/comp.lang.ruby/browse_frm/thread/58df01a5bd0ab5b8/330841516d29bc54?lnk=st&q=ruby+iconv+windows+install&rnum=6&hl=en#330841516d29bc54

···

On 12/1/05, Anders <schneida@seiu.org> wrote:

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

Thanks, Dave! That did the trick.

Anders