URLエンコーディングの違い

URLエンコードはその名の通りURLに使えない文字をエスケープする記述ですが言語や関数によって若干ぶれがあるのですが実際に比較検証した事がなかったのでやってみました。
まずURLはURL Standardに定義されていて
PHPの世界ではurlencode()とrawurlencode()があってurlencode()は半角スペースを「+」に変換したり「~」も変換したりします。
Pythonはurllib.parse.quote()とurllib.parse.quote_plus()があってurllib.parse.quote_plus()は半角スペースを「+」に変換したり「/」も変換したりします。
JavaScriptはencodeURI()とencodeURIComponent()があってencodeURIComponentはURI予約語「#$&+,/:;=?@」も変換するという違いがあります。

差異のある文字をピックアップしたアスキー表を作成しました。(全文字コードはコチラ

10進数16進数実体PHP1PHP2PY1PY2JS1JS2
32U+0020+%20+%20%20%20
33U+0021!%21%21%21%21!!
35U+0023#%23%23%23%23#%23
36U+0024$%24%24%24%24$%24
38U+0026&%26%26%26%26&%26
39U+0027%27%27%27%27
40U+0028(%28%28%28%28((
41U+0029)%29%29%29%29))
42U+002a*%2A%2A%2A%2A**
43U+002b+%2B%2B%2B%2B+%2B
44U+002c,%2C%2C%2C%2C,%2C
47U+002f/%2F%2F%2F//%2F
58U+003a:%3A%3A%3A%3A:%3A
59U+003b;%3B%3B%3B%3B;%3B
61U+003d=%3D%3D%3D%3D=%3D
63U+003f?%3F%3F%3F%3F?%3F
64U+0040@%40%40%40%40@%40
126U+007e~%7E~~~~~
PHP1:PHPの関数「urlencode()」
PHP2:PHPの関数「rawurlencode()」
PY1:Pythonの関数「urllib.parse.quote_plus()」
PY2:Pythonの関数「urllib.parse.quote()」
JS1:Pythonの関数「encodeURI()」
JS2:Pythonの関数「encodeURIComponent()」

デコードは概ね問題無いが「+」を絡めると誤変換が起こる。
例えばサーバー側でrawurlencode()やurllib.parse.quote_plus()を使ってエンコードした文字列をブラウザのrawurlencodeでデコードすると誤変換が起こる。
なのでサーバーでもクライアントでも使うなら「+」を使わないdecodeURIComponent()・urllib.parse.quote()・rawurldecode()がオススメです。

なお変換するならURLエンコードとデコード -UDA TOOL-を用意しております。

Tags: , ,

トラックバック

コメントを書く