なかだです。

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はできる。 中田 伸悦