in between days

表参道で働くシニアのブログ

はてなブックマークがパーセントエンコーディングの場合が感じやすすぎる件

誤訳! 「場合が感じやすい」てゆか「case sensitive」な。

ということで昨日のこれ↓の続き

はてなブックマークで「はてなブックマークの本欲しい!とは - はてなダイアリー」のエントリページが2種類(以上)存在するのはなぜか?

はてなブックマークでは、表示時とブックマーク時で扱いが異なる

  • 表示するときは、上記のように大文字に正規化する
  • ブックマーク時には何もしない(=小文字のままでブックマーク可能)

このようにブックマークするときと(ブックマークされたものを)表示するときで処理は異なっているのはおかしい。たぶんどっちかの処理が間違ってるんだろうという感じがするし、感覚的にはパーセントエンコーディング部分が大文字だろうと小文字だろうと同じURLとして扱う表示時の処理が正しいような気がするが、果たしてどうなんだろうか。

はてなブックマークの挙動をRFC3986とつき合わせてみる

まず、URLのパーセントエンコーディングの大文字と小文字を区別してブックマークを受け付けるというはてなブックマークの仕様は、RFC3986に定義されたURLの文法に準拠していない。RFC3986の2.1節「Percent-Encoding」には次のように書かれている:

The uppercase hexadecimal digits 'A' through 'F' are equivalent to the lowercase digits 'a' through 'f', respectively. If two URIs differ only in the case of hexadecimal digits used in percent-encoded octets, they are equivalent.

RFC3986 - Uniform Resource Identifier (URI): Generic Syntax - 2.1. Percent-Encoding

日本語訳はこちら

大文字の16進数字'A'から'F'は、小文字の'a'から'f'とそれぞれ等価である。2つのURIのパーセントエンコードされたオクテット内で使用される16進数字の大文字・小文字のみが異なる場合、それらは等価である。
Uniform Resource Identifiers

つまり、はてなブックマークで、パーセントエンコーディング部分が小文字のURLと大文字のURLを別個にブックマークできてしまうのは、なんとなく「それって変なんじゃね?」という感覚的なものだけじゃなくって、RFC準拠としてもおかしい。パーセントエンコーディング部分については大文字だろうが小文字だろうが、同一のURLとして扱わなければならない。
ということで、アイディア出してみた:

idea:17845 - はてなアイデア

関連アイディアと合わせて実装されることを期待したい。

表示するときの処理は正しい(はてなダイアリーがむしろアヤシイ)

一方、表示するときの処理は、RFC3986の定義に合致している。

上で引用した2.1節の続きにはこう書かれている:

For consistency, URI producers and normalizers should use uppercase hexadecimal digits for all percent-encodings.

整合性を持たせるため、URIを生成したり正規化する際には、全てのパーセントエンコーディングについて、大文字の16進数字が使用されるべきである。

したがって、ブックマークを表示させるときに、リクエストURLのパーセントエンコーディング部分が大文字になっていようが小文字になっていようが、すべて大文字のURLとして処理するというのは正当な処理のようだ。

一方で、はてなダイアリーはキーワードをリンクさせる際に、URLのパーセントエンコーディング部分で小文字の16進数文字を使っているが、これはRFC3986に準拠し切れていないということである。ある意味で、はてなダイアリーがRFC3986に完全準拠し、パーセントエンコーディングを大文字で行っていたなら、今回のような矛盾は起こらなかっだろう。

そういう意味で、原因ははてなダイアリーにもあるとも言えるかもしれない。
こちらもアイディアを出してみた:
idea:17846 - はてなアイデア

「もうひとつの問題」についても考えてみ…ようとして挫折した

昨日のエントリーで「もうひとつの問題」として取り上げたのは、

の2つのURLが別個のものとして扱われることだが、上に比べると、下のURLは

  1. “%(パーセント)”が“%25”に(再帰的に?)パーセントエンコードされている
  2. “:(コロン)”が“%35”にエンコードされていない

という2点が違っている。

しかし、これはRFC3986に従うなら等価なものとして扱われるべきではないだろうか?

と疑問を呈した形としているのはRFCを読んでてもよくわかんなかったからです!

これはもっと詳しい人にまかせた。

ところで“//”ってパーセントエンコードしなくていいのかなあ?

いつごろどのようにこの問題が生じたのか?

どうやらこの問題はすでにアイディアで指摘されているもよお

idea:14788 - はてなアイデア

どうやら 2007-04-08 あたりから急にこういう問題がおきたようである。

いったい何があったのか?

これかな…

はてなブックマーク - 機能変更、お知らせなど - はてなブックマーク日記 - URLの小文字・大文字の区別について

2007年04月08日 id:otsune『散々放置してたけどd:ysano2005とd:Ysano2005でnaoya弄りされたとたんに修正に手をつけるnaoyaのナイーブさに皆が萌えた日』