URLエンコーディング

以前書いたエントリで「パーセントエンコーディング」と書いたのですが、RFC上の名称であって、一般的には「URLエンコーディング」というようですね。下記のとおり「どの文字コードを用いるかは実装によって異なる」とありますが、UTF-8エンコードされた理由が、良く分かってないので実験しました。

URIの規則を定める RFC 3986 では、URIにASCIIの非予約文字以外の文字データを用いる場合には、「%xx」(xxは16進数)という形でコードを表記することが定められている。その際にどの文字コードを用いるかは実装によって異なる。

パーセントエンコーディング - Wikipedia

確認事項

form要素のaccept-charset属性を指定していない場合、ブラウザの実装としては、入力フォームのHTMLのcharset属性と同じ符号化で処理してくれるそうです。なので、入力フォームのHTMLのcharset属性をUTF-8からShift_JISに変更して同じことを試してみます。

結果(UTF-8の場合)

リクエスト

http://ubuntu-vm/cgi-bin/form.cgi?hl=ja&data=%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A&btn=GET

レスポンス

結果(Shift-JISの場合)

リクエスト

http://ubuntu-vm/cgi-bin/form.cgi?hl=ja&data=%82%A0%82%A2%82%A4%82%A6%82%A8&btn=GET

レスポンス

追加調査

レスポンスされたデータが文字化けするのは、サーバサイドの実装に原因がありそうです。もちろん文字コードを意識した実装などしてませんし、最初うまく処理されたのは、以下によるもののようです。

内部的には、Perlは、プラットフォームの8ビットキャラクタセット(例えば、Latin-1)は、デフォルトはUTF-8ですが、Unicode 文字列ににエンコードします。特に、文字列中の、全てのコードポイントは、0xFF以下であれば、 Perlは、ネイティブの8ビットのキャラクタセットを使います。そうでなければ、UTF-8を使います。

perluniintro - Perl Unicode の手引き

難しい…。ウェブで利用される文字コード、UnicodeがASCIIを上回る--グーグルが明らかに - CNET Japanって言ってるし、XMLの標準エンコーディングにもなってるので、今後はUTF-8で統一しよう。