From: Fujioka Date: 2008-09-14T00:27:27+09:00 Subject: [ruby-dev:36289] Re: [Feature #542] cgi.rb : CGI::unescape return encoding 藤岡です。 > Web サーバが form を含む HTML を送った時に、ブラウザがどのよ > うな charset で返事を Web サーバ返すべきかを accept-charset > のような明示的な形や、HTML 自体の encoding として暗黙な形で > 指示しているので、その指示を cgi.rb に教えてやるという意味を > 意図していました。 > > なお、手元の iceweasel 2.0.0.16 は accept-charset を理解して > 従うようです。 > やはり、明示的にcgi.rbのインスタンスに伝えておいた方がよさそうですね。 エラー処理とか何もまだないですが、 とりあえず下のパッチで以下のようなCGIアプリは動きます。 この方針としてはいかがでしょうか?>ほかの意見ありそうな方々 あと、エンコーディングが違う文字列を送りつけられた場合に どうするかですが、 1. 放置(おそらくどこかで例外を起こして止まる) 2. 検証しておかしかったときはkeyごと無視する 3. 検証しておかしかったときはkeyはあるけど中身をnilにする 4. 検証しておかしかったときはvalueをASCII-8BITにしてしまう 4が親切かなと思うのですが、ご意見よろしくお願いします。 #!/Users/fujioka/local/bin/ruby19 # vim:fileencoding=UTF-8 require 'cgi' @cgi=CGI.new("html3","UTF-8") @header = { "type" => "text/html", "charset" => "UTF-8" } @cgi.out(@header) do @cgi.html do @cgi.head{@cgi.title{"たいとる"}}+ @cgi.body do "結果:#{@cgi['title']}"+ @cgi.form("action"=>@cgi.script_name) do @cgi.text_field("name"=>"title")+ @cgi.hidden("name"=>"key","value"=>"value")+ @cgi.submit("value"=>"OK") end end end end Index: lib/cgi/core.rb =================================================================== --- lib/cgi/core.rb (revision 19280) +++ lib/cgi/core.rb (working copy) @@ -600,7 +600,7 @@ stdinput.read(Integer(env_table['CONTENT_LENGTH'])) or '' else read_from_cmdline - end + end.force_encoding(@encoding) ) end @@ -667,7 +667,8 @@ # from the command line or (failing that) from standard input. Otherwise, # cookies and other parameters are parsed automatically from the standard # CGI locations, which varies according to the REQUEST_METHOD. - def initialize(type = "query") + def initialize(type = "query",encoding="ASCII-8BIT") + @encoding=encoding if defined?(MOD_RUBY) && !ENV.key?("GATEWAY_INTERFACE") Apache.request.setup_cgi_env end