• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:【ruby】クラスCGIを改造して、クエリの文字コードを変えたい)

【ruby】クラスCGIを改造して、クエリの文字コードを変えたい

このQ&Aのポイント
  • RubyのCGIクラスを改造して、クエリの文字コードを自動的に変換する方法を探しています。
  • Windowsサーバで使用しているため、取得したクエリ(フォームフィールド)をs-jisに変換する必要があります。
  • 以前にはaliasを使用して同様のことを試みましたが、成功しませんでした。改造方法についてのご指導をお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.1

テストしてませんが、これでどうでしょう。 class MyCGI < CGI  def initialize(type = "query")   super   @params = @params.each do|key,val|    @params[key]=val.collect{|x|x.tosjis}   end  end end cgi=MyCGI.new if cgi.has_key?('arg') then  STDERR.puts cgi['arg']  cgi.out(){'ok'} end あと、tosjisメソッドは入力文字列コード自動判定ですが、短い文字列だと判定が間違う可能性があるので、kconvメソッドで入力文字コードも指定した方がいいです。

kingfruits
質問者

補足

notnotさん ご回答ありがとうございます。 #たびたびのご回答、ありがとうございます。 >def initialize(type = "query") のtype = "query"の意味がよくわかりませんでしたが、 def initialize()として動かしてみたところ、問題なく動作しました。 ご回答頂いた解法は、CGIクラスそのものを改造というより、CGIクラスを 継承して、新しいクラスMyCGIを作る方法ですが、できればCGIクラスそのものを改造したいです。 もしくは、新しいクラスを生成しないで、特異クラス定義でなんとかならないでしょうか? cgi=CGI.new class << cgi ここをどう書いたらよいか解らない。 end 上手く伝えられないのですが、『cgi=MyCGI.new』と記述する事になぜか 抵抗がありまして。。 良案ありましたら、よろしくお願いいたします。

その他の回答 (1)

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.2

>継承して、新しいクラスMyCGIを作る方法ですが、できればCGIクラスそのものを改造したいです。 機能の追加じゃなくて機能を変えることになるので、新規クラスがいいと思いますが。 もとのクラスでやるとすると、cgi.rbの最後の方に書いてあるdef initialize(...) .... end を全部コピーして、その最後の部分に、@paramsの書き換えを追加するのでしょうか。 class CGI  def initialize(type = "query")   ここにオリジナルのコードをコピー   @params = @params.each do|key,val|    @params[key]=val.collect{|x|x.tosjis}   end  end end あるいは、paramsメソッドだけ書き換えればいいのであれば、 class CGI  module QueryExtension   def params    w = {}    @params.each{|k,v| w[k]=v.collect{|x| x.tosjis}}    w   end  end end 毎回全部をコード変換するので、あまり良くないかな?フラグを設けて、初回だけ@paramsを書き換えるようなほうがいいでしょうね。 いずれにせよ、CGIクラスの機能を変更したい(orサブクラスを作りたい)のならば、cgi.rbを読まないとだめですよ。

kingfruits
質問者

お礼

notnotさん ご回答、ありがとうございます。 大変勉強になります。 >>機能の追加じゃなくて機能を変えることになるので、新規クラスがいいと思いますが。 先日notnotさんにご回答頂いた【ruby】クラスCGIを改造したい(​http://oshiete1.goo.ne.jp/qa4944090.html​)ですと、aliasを使って CGIクラスの機能を変えていたので、『あり』なのかと思ってましたが、今回の解法をみますと、一番最初のご回答がスッキリしてるように思います。 >>cgi.rbを読まないとだめですよ。 はい。

関連するQ&A