Hi Matt,

The database is legacy and is in LATIN1 and therefore I cant change the 
encoding. Everything works fine until I get to the @doc.write call which 
in turn ends up  calling the method that I hacked to work.

I see that they aliased the method here in the library:
       alias encode encode_iconv
in a register block that is a little mysterious to me - but maybe I can 
alias to redirect to what I want in some way.

I can use brute force but hoped someone might have experience in 
overriding module methods as that seems to be the least invasive way to 
fix this.

Maybe I will post this on Nabble somewhere as well just in case.

Thanks,
  Carl



Matt Aimonetti wrote:
> Make sure the charset and collation is set correctly in your DB.
> The rexml version you are using is the one that's coming with 1.8 and 
> therefore doesn't have anything to do with 1.9 encoding.
>
> My guess is that your db table isn't set as utf8.
>
> - Matt
>
>
> On Wed, Sep 23, 2009 at 1:39 PM, nblinux <[email protected] 
> <mailto:[email protected]>> wrote:
>
>
>     HI,
>
>     I have a ruby program that takes activerecord data and outputs it to
>     XML using the REXML library.
>
>     It has been working fine until some accented characters were used in
>     one of the fields.
>
>     I have isolated the error message to this file C:\ruby\lib\ruby
>     \1.8\rexml\encodings\ICONV.rb and line after the commented out line
>     below:
>     =====================
>     module REXML
>      module Encoding
>        def decode_iconv(str)
>          Iconv.conv(UTF_8, @encoding, str)
>        end
>
>        def encode_iconv(content)
>          # cag changed to test encoding hack
>          #Iconv.conv(@encoding, UTF_8, content)
>          Iconv.conv(@encoding, 'LATIN1', content)
>        end
>
>        register("ICONV") do |obj|
>          Iconv.conv(UTF_8, obj.encoding, nil)
>          class << obj
>            alias decode decode_iconv
>            alias encode encode_iconv
>          end
>        end
>      end
>     end
>     =======================
>
>     So I think this has to do with REXML expecting UTF-8 which is fine in
>     Ruby 1.9 but Ruby 1.8 uses LATIN1 I think. I hacked the file as shown
>     above and this works, but what I really want to do is override the
>     "encode_iconv" method in this module in my own code so I am not
>     changing the core libraries.
>
>     I have attempted a couple of things but can't quite get it such as
>     putting this at the top of my main file before call that uses it:
>     ===========================
>     include REXML
>
>     module REXML
>        module Encoding
>        def encode_iconv(content)
>          Iconv.conv('ISO-8859-1', 'LATIN1', content)
>        end
>      end
>     end
>     ===========================
>
>     To test I just created a simple xml document
>       @doc = Document,new("<xml? version='1.0' encoding='iso-8859' ?
>     ><some text here/>")
>       ... add some elements etc ...
>     and then this is the call where it invoked:
>       @doc.write(xml_string,0)
>
>     I also tried eval technique from a David Black post and saw some posts
>     indicating use of self and object reference.
>
>     Anyone got an idea? Is is because it is mixed in somewhere when REXML
>     is loaded and thus my override attempts are not recognized?
>
>     Thanks,
>      Carl
>
>
>
>
> >


--~--~---------~--~----~------------~-------~--~----~
SD Ruby mailing list
[email protected]
http://groups.google.com/group/sdruby
-~----------~----~----~----~------~----~------~--~---

Reply via email to