中田様

ご回答ありがとうございます。
教えていただいた下記コードを追記することで
Uconvでのエンコードが有効になっているようです。
--------------------------------------------
require "rexml/document"
require "rexml/encodings/ICONV"
module REXML::Encoding
  @encoding_methods.delete("ICONV")
end
--------------------------------------------

もともとIconvの利用は想定していなかったため
この方法でなんとかなるかと思います。

ありがとうございました。


> なかだです。
> 
> At Tue, 18 Oct 2005 09:58:43 +0900,
> 杉原 透修 wrote in [ruby-list:41325]:
> > rexmlに「 彭の特殊記号を渡すとエラーで落ちてしまいます。
> > 以下のコードで再現します。
> 
> iconvを一切使わないようにするのでよければ、変換メソッド登録のテー
> ブルから消してしまうという方法はあります。
> 
> > require "rexml/document"
>   require "rexml/encodings/ICONV"
>   module REXML::Encoding
>     @encoding_methods.delete("ICONV")
>   end
> 
> あるいはrexml/encodings/ICONV.rbをすでに読み込んだことにして登
> 録させないとか。
> 
>   $" << "rexml/encodings/ICONV.rb"
> 
> どちらも内部構造に強く依存するという点では望ましくないのは確か
> ですが。
> 
> > 単にIconvで文字エンコードに失敗しているだけだと思うのですが
> > IconvよりもUconvを優先して文字エンコード出来ないかと考えています。
> 
> iconvはよくいえば汎用、ぶっちゃけ(大本の規格からして)中途半端な
> ので、私も専用の変換を優先したほうがいいのではないかと思います
> が、rexmlの作者のSean Russellにはまた別の考えがあるのかもしれま
> せん。
> 
> > rubyインストール時にiconv無効オプションも無いようですのでrexmlのソース
> > を変更する必要があるかと思うのですが、奥が深く修正箇所が判明しておりません。
> > 下記サイトで対応されていらっしゃる方もおられるようですが、修正箇所
> > について、どなたかご教示いただけないでしょうか?
> 
> --without-iconvでコンパイルしなくするというパッチ[1]はまだ入っ
> てませんね。ext/iconv/extconf.rbを消しておくだけでもコンパイル
> されなくはなりますが。
> 
> [1] http://www.dm4lab.to/~usa/ruby/d/200510b.html#id20051016_P1_2
> 
> 
> Index: lib/rexml/encoding.rb > =================================================================== > RCS file: /cvs/ruby/src/ruby/lib/rexml/encoding.rb,v > retrieving revision 1.5.2.1 > diff -U2 -p -w -r1.5.2.1 encoding.rb > --- lib/rexml/encoding.rb 19 May 2005 03:51:52 -0000 1.5.2.1 > +++ lib/rexml/encoding.rb 18 Oct 2005 02:10:51 -0000 > @@ -26,26 +26,20 @@ module REXML > $VERBOSE = false > return if defined? @encoding and enc == @encoding > - if enc and enc != UTF_8 > - @encoding = enc.upcase > + if enc > + raise ArgumentError, "Bad encoding name #{enc}" unless /\A[\w-]+\z/n =~ enc > + @encoding = enc.upcase.untaint > + else > + @encoding = UTF_8 > + end > + err = nil > + [@encoding, "ICONV"].each do |enc| > begin > - require 'rexml/encodings/ICONV.rb' > - Encoding.apply(self, "ICONV") > + require File.join("rexml", "encodings", "#{enc}.rb") > + return Encoding.apply(self, enc) > rescue LoadError, Exception => err > - raise ArgumentError, "Bad encoding name #@encoding" unless @encoding =~ /^[\w-]+$/ > - @encoding.untaint > - enc_file = File.join( "rexml", "encodings", "#@encoding.rb" ) > - begin > - require enc_file > - Encoding.apply(self, @encoding) > - rescue LoadError > - puts $!.message > - raise ArgumentError, "No decoder found for encoding #@encoding. Please install iconv." > end > end > - else > - @encoding = UTF_8 > - require 'rexml/encodings/UTF-8.rb' > - Encoding.apply(self, @encoding) > - end > + puts err.message > + raise ArgumentError, "No decoder found for encoding #@encoding. Please install iconv." > ensure > $VERBOSE = old_verbosity >
> > -- > --- 僕の前にBugはない。 > --- 僕の後ろにBugはできる。 > 中田 伸悦 >