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
-~----------~----~----~----~------~----~------~--~---