From: Nobuyoshi N. <no...@ru...> - 2010-10-04 23:43:48
|
なかだです。 At Mon, 04 Oct 2010 23:52:41 +0200, Kazuhiko wrote: > 例外が起きているのが > > > incompatible character encodings: UTF-8 and ASCII-8BIT (Encoding::CompatibilityError) > > > > /usr/local/lib/ruby/1.9.1/cgi/util.rb:17:in `gsub' > > /usr/local/lib/ruby/1.9.1/cgi/util.rb:17:in `unescape' > > /home/pmakino/public_html/tdiary/tdiary.rb:262:in `add_referer' ←ここ > > なのですから、パッチをあてるべき箇所は CGI.unescapeのバグではないかとも思いましたが、そもそもtdrファイルに想定 されるエンコーディングはなんでしょうか。 diff --git i/lib/cgi/util.rb w/lib/cgi/util.rb index 7be3e92..9f8a63a 100644 --- i/lib/cgi/util.rb +++ w/lib/cgi/util.rb @@ -14,7 +14,7 @@ class CGI # string = CGI::unescape("%27Stop%21%27+said+Fred") # # => "'Stop!' said Fred" def CGI::unescape(string,encoding=@@accept_charset) - str=string.tr('+', ' ').gsub(/((?:%[0-9a-fA-F]{2})+)/) do + str=string.tr('+', ' ').force_encoding(Encoding::ASCII_8BIT).gsub(/((?:%[0-9a-fA-F]{2})+)/) do [$1.delete('%')].pack('H*') end.force_encoding(encoding) str.valid_encoding? ? str : str.force_encoding(string.encoding) diff --git i/test/cgi/test_cgi_util.rb w/test/cgi/test_cgi_util.rb index 479df68..71e8bea 100644 --- i/test/cgi/test_cgi_util.rb +++ w/test/cgi/test_cgi_util.rb @@ -27,6 +27,7 @@ class CGIUtilTest < Test::Unit::TestCase def test_cgi_unescape assert_equal(@str1, CGI::unescape('%26%3C%3E%22+%E3%82%86%E3%82%93%E3%82%86%E3%82%93')) assert_equal(@str1.encoding, CGI::unescape('%26%3C%3E%22+%E3%82%86%E3%82%93%E3%82%86%E3%82%93').encoding) if defined?(::Encoding) + assert_equal("\u{30E1 30E2 30EA 691C 7D22}", CGI.unescape("\u{30E1 30E2 30EA}%E6%A4%9C%E7%B4%A2")) end def test_cgi_pretty -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦 |