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進数 | 実体 | PHP1 | PHP2 | PY1 | PY2 | JS1 | JS2 |
---|---|---|---|---|---|---|---|---|
32 | U+0020 | + | %20 | + | %20 | %20 | %20 | |
33 | U+0021 | ! | %21 | %21 | %21 | %21 | ! | ! |
35 | U+0023 | # | %23 | %23 | %23 | %23 | # | %23 |
36 | U+0024 | $ | %24 | %24 | %24 | %24 | $ | %24 |
38 | U+0026 | & | %26 | %26 | %26 | %26 | & | %26 |
39 | U+0027 | ‘ | %27 | %27 | %27 | %27 | ‘ | ‘ |
40 | U+0028 | ( | %28 | %28 | %28 | %28 | ( | ( |
41 | U+0029 | ) | %29 | %29 | %29 | %29 | ) | ) |
42 | U+002a | * | %2A | %2A | %2A | %2A | * | * |
43 | U+002b | + | %2B | %2B | %2B | %2B | + | %2B |
44 | U+002c | , | %2C | %2C | %2C | %2C | , | %2C |
47 | U+002f | / | %2F | %2F | %2F | / | / | %2F |
58 | U+003a | : | %3A | %3A | %3A | %3A | : | %3A |
59 | U+003b | ; | %3B | %3B | %3B | %3B | ; | %3B |
61 | U+003d | = | %3D | %3D | %3D | %3D | = | %3D |
63 | U+003f | ? | %3F | %3F | %3F | %3F | ? | %3F |
64 | U+0040 | @ | %40 | %40 | %40 | %40 | @ | %40 |
126 | U+007e | ~ | %7E | ~ | ~ | ~ | ~ | ~ |
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: JavaScript, PHP, Python