この断片で理解してもらえるだろうか。
categorized.keys.each do |c| PStore.new(cache_file(c)).transaction do |db| categorized.fetch(c) #=> key not found (KeyError) db['category'] = {} unless db.root?('category') db['category'].update(categorized[c]) end end
あるハッシュのキーについて繰り返しているのに、ハッシュにはそのキーが存在しないという、この不思議。
このとき、c は、
"\xE6\x9C\xAC\xE6\x97\xA5\xE3\x81\xAE\xE8\xB3\xBC\xE5\x85\xA5" ASCII-8BIT
ハッシュのキーリストとそのエンコーディングは、
"\xE6\x9C\xAC\xE6\x97\xA5\xE3\x81\xAE\xE8\xB3\xBC\xE5\x85\xA5" ASCII-8BIT "本" UTF-8 "マンガ" UTF-8 "雑誌" UTF-8
存在しているだろうに……。
さくらインターネット上で tDiary を ruby1.9.1-p0 で動かす - まちゅダイアリー(2009-02-19)(14:57現在、日別表示が不可能な状態。最新表示は可能)
* 正しくは ruby-1.9.2dev(2009-02-03)
最終更新: 2009-08-29T06:18+0900
> URI.escape("http://exmaple.com/foo bar?a=b=c;d=e#hoge#fuga") => "http://exmaple.com/foo%20bar?a=b=c;d=e%23hoge%23fuga"
URLをパーツに分解せずに gsub一発でエスケープ(エンコード)するなんて不可能だと思うのです。仮にそうまでしても、上の例のように、「#」が CGIパラメータとして受け渡されるように、「%23」にエンコードするべきか、URLを構成する fragmentを示す記号として、「#」のまま残すべきか、判断できない(でしょう?)。
できないことをできるかのように見せかけるより、できない(のでメソッドを提供しない)という方が親切だと思う。
JavaScriptの提供する encodeURIComponent(「/」も「?」も「#」も「=」もエンコードするメソッド)相当のメソッドがあれば、それで十分だと思うんだけど。
http://exmaple.com/foo bar/baz/
なんてのは不正な URLだから、どこにも存在しないのです。アドレスバーに表示するときに人間に読みやすいように、と上のようにデコードして表示することはあるかもしれないけれど、オリジナルの正しい URLは同時に保持しておくべきで、表示用の文字列からエンコードしようなんて思っちゃダメなのです。ブラウザのアドレスバーは表示と同時に編集も可能だから話は簡単ではないけど……これまでのところ、Firefoxは(自らの責任で)よきに計らってくれています。
RFC(古いのと新しいのと二種類?)も読んでいない放言なので、実は「できる」という可能性がなきにしもあらず。
[ruby-dev:39188] Re: URI.escape_component から、
さておき、URI.escapeは独特の動きをするので、JavaScript/ECMAScript の escape とも encodeURI とも encodeURIComponent とも違います。 そういえば、現在の仕様の意図をお聞きしたかったんだった [ruby-dev:38124] なお、面倒な話が出てきた時には、とりあえず akr さんが 既に取り上げていないか調べるわけですが、やっぱり扱っているわけです。 http://www.a-k-r.org/d/d2004_07.html https://www.codeblog.org/blog/akr/20070222.html