@kyanny's blog

商品にならぬ技術は役に立たない - トーマス・エジソン

%エスケープ続き

なんでばぐるのかはおぼろげにわかった。ちょっと理解が深まった。けどこれ!っていう解決策はわからなかった。

my $url = $self->r->param("url");
my $uri = URI->new($url);

これでだいたい ok で、でも query_string を含む URL だった場合でかつその query_string に含まれている '/' (スラッシュ) も %2F にしたい、というケースがあってそれは URI オブジェクトのメソッドで探せなかった。ので仕方なく、 まず $uri->as_string な値で DB から一度引いて、次に $uri->as_string を '?' で path と query_string に分割し query_string のほうだけ / => %2F に置換してもう一度ひく、ということをした。

疑問がいくつかあり、

  1. $uri->as_string と $uri->canonical の違いがわからない (ポート番号が 80 だったら取るとか書いてあるけどパスとかはいじるのかいじらないのか?)
  2. $query_string =~ s{([/])}{'%'. unpack("H2", $1)}eg; とか最初やったけど %2f になってしまう(大文字小文字が違う) 大文字で取る方法はないんだろうか?
  3. こういうのをまとめてやる方法がどっかにないだろうか?