パーセントエンコーディングが実際に解決している問題
URLは本来、ブラウザやサーバー、メールクライアントなど数え切れないシステムの間を、確実に、コンパクトなテキストとして行き来できることを目的としており、その多くは歴史的に限られたASCII文字しか安全に扱えませんでした。パーセントエンコーディングは、その安全な範囲の外にある文字と、データとして使われている予約文字を、その文字のUTF-8バイト表現にもとづいた標準的な%XX形式に変換することで、どのシステムが扱っても曖昧さのない、安全にやり取りできる文字列であることを保証しています。
エンコードされたURLを実際に壊してしまうミス
二重エンコード、つまりすでにパーセントエンコードされた文字列にもう一度パーセントエンコードをかけてしまうミスは、実際によくある不具合のひとつです。既存の%記号が%25に変換されてしまい、見た目だけでは気づきにくい形でURLが壊れてしまいます。もうひとつよくある混同は、+と%20をどこでも同じ意味だと思い込むことです。+が「スペース」を意味するのはフォームエンコードされたクエリデータの中だけであり、URLのパス部分などで使うと、スペースではなく文字どおりのプラス記号として誤解されることがあります。
よくある質問
なぜ韓国語や日本語、中国語の1文字をエンコードすると、長いパーセント記号の並びになるのですか?
これらの文字は基本的なASCIIの範囲外にあり、UTF-8では複数のバイト(多くのCJK文字では一般的に3バイト)で表現されるためです。そのバイトひとつひとつが別々の%XXとしてエンコードされるため、短い非ラテン文字の文字列でも、エンコード後にはかなり長い文字列になります。
スペースを表す%20と+の実際の違いは何ですか?
%20はスペースを表す汎用的なパーセントエンコーディングで、URLのどこでも有効です。+でスペースを表すのは、application/x-www-form-urlencoded形式のフォームデータの中だけに当てはまる、より限定的で古い慣習であるため、その文脈以外で+を使うと、スペースではなく文字どおりのプラス記号として解釈されてしまうことがあります。