From: "Martin J. Dürst" Date: 2009-09-10T15:01:29+09:00 Subject: [ruby-dev:39286] Re: Is URI.decode() broken? On 2009/02/14 20:59, NARUSE, Yui wrote: > 成瀬です、 > > Nobuyoshi Nakada wrote: >> なかだです。 >> >> At Sat, 14 Feb 2009 12:51:57 +0900, >> MOROHASHI Kyosuke wrote in [ruby-dev:38005]: >>> Ruby 1.9.1p0で、URI.decode()がうまく動かないようです。 >>> 一文字ずつデコードされるため(?)、マルチバイト文字を復元できていません。 >>> >>> $ ruby19 -Ku -ruri -ve 'p ["日本語".dump, URI.unescape( URI.escape("日本語") ).dump]' >>> ruby 1.9.1p0 (2009-01-30 revision 21907) [i686-darwin9] >>> ["\"\\u{65e5}\\u{672c}\\u{8a9e}\"", >>> "\"\\u{e6}\\u{97}\\u{a5}\\u{e6}\\u{9c}\\u{ac}\\u{e8}\\u{aa}\\u{9e}\""] >> UTF-8決め打ちはまずいと思いますが、こういう場合って >> default_externalでいいんでしょうか。 escape の場合、引数のエンコーディングから UTF-8 に変換して、その後バイト 語とに %-encoding するのは筋だと思います。第二引数では UTF-8 意外のエン コーディングが指定できるといいと思います。default_external はあくまでも 「ここの計算機のプログラムの外のエンコーディングであって、Web に通用する ものではありません。 unescape の場合は %-encoding を解けた後の想定するエンコーディングと、結 果のエンコーディングの二つを考える必要がある。前者については、バイトパ ターンが UTF-8 に準拠したら UTF-8、そうでなかったら ASCII-8BIT、別に指定 があったらそのエンコーディング、でいいと思います。このとき、「一部分が UTF-8 準拠、一部分は違う」の問題がありうる。その場合「全部 ASCII-8BIT」 と「UTF-8 のところを unescape、残りを % のまま」の選択肢が考えられる。 後者の「結果のエンコーディング」は前者が ASCII-8BIT の場合 ASCII-8BIT し かないが、後 default-internal と指定されたエンコーディング (前者と同様又 は違う(1)) が考えられる。 (1) の例: あるサーバで SJIS が使われているので前者には SJIS が必要だけ ど、プログラム内は EUC-JP に統一されているのは応用例として考えられます。 > 基本的には引数のエンコーディングがいいのですかねぇ。 > で、US-ASCII だった場合は UTF-8 で。 > > Martin さんどう思われますか? 意見が遅くて申し訳ございません。この操作をどのぐらい IRI <-> URI の変更 のためだと考えられるかと思います。その場合、全体的な変換にはメソッド名と して URI.to_IRI とか URI.to_URI/from_IRI (IRI クラスが別に必要でしたら IRI.to_URI) 等の方がいいのではないかとも思います。しかしその変換はただの %-encoding よりもう少し複雑、しかも現在検討中です。 よろしくお願いします。 Martin. -- #-# Martin J. Dürst, Professor, Aoyama Gakuin University #-# http://www.sw.it.aoyama.ac.jp mailto:duerst@it.aoyama.ac.jp