PHP中的urlencode和urldecode的理解

平時在工做中常常要寫 $xxx = urldecode($_GET['xxx']);的相似代碼,大部分的狀況都是沒有問題的.也能很好的工做.
因此也沒有怎麼在乎.可是忽然有一天我想到 $xxx =$_GET['xxx']和$xxx = urldecode($_GET['xxx']); 獲取的值都是同樣的,那爲什麼還須要作一次urldecode呢
 
爲此我作一下測試.
 
個人測試代碼1.php 以下
<?php
var_dump($_GET); 
只是將請求上帶的參數值打印出來而已
 
咱們以中國爲例子進行說明
咱們分紅如下3中狀況
 
a 當 中國 未進行urlencode編碼的時候
測試地址:  http://xxx.com/1.php?a=中國
執行的結果:
array (size=1)
  'a' => 
string
 '中國' (length=6)
 
b 當 中國 進行一次urlencode編碼的時候 ===> %E4%B8%AD%E5%9B%BD
測試地址:  http://xxx.com/1.php?a=%E4%B8%AD%E5%9B%BD
執行的結果:
array (size=1)
  'a' => 
string
 '中國' (length=6)
 
 
c 當 中國 進行2次urlencode編碼的時候===> %25E4%25B8%25AD%25E5%259B%25BD
 
測試地址:  http://xxx.com/1.php?a=%25E4%25B8%25AD%25E5%259B%25BD
執行的結果:
 
array (size=1)
  'a' => 
string
 '%E4%B8%AD%E5%9B%BD' (length=18)
 
從以上可知
當咱們用$_GET的時候其實已經進行了一次urldecode的操做.
    這裏特別要說明一點的是 a的狀況,明明傳入值就是中國,按照剛纔的說明獲取GET的時候已經作過一次urldecode,那麼爲什麼獲得值仍是中國呢 ?
    緣由是urldecode('中國')的值就是中國.
 
因此若是咱們程序中若是有如下的代碼的話
$a = urldecode($_GET['a']);的時候其實咱們已經不經意間作了2次urldecode ------>這一點請務必注意
 
爲什麼我特別指出咱們要注意這個問題呢? 
主要是我作的項目不少須要微信受權,而受權服務的接口每每提供成以下的格式
http://xxxx.com/weixinauthorize?redirect=xxxxxx 其中參數redirect是一個回調地址
 
我如下面的場景爲例來講明問題
 
先來看調用端的狀況,調用的代碼應該是怎麼寫的
假如說 
咱們須要傳入的回調地址是  http://b.com/2.php
可是咱們但願在這個地址上另外增長一個回調地址callbackurl,好比說  http://c.com/3.php
如如下的形式
http://b.com/2.php?callbackurl=http://c.com/3.php   <---- 這個地址是沒法工做的
http://b.com/2.php?callbackurl=urlencode(http://c.com/3.php )  <---- 這個地址是才能工做的
 
因此咱們按照如下2步進行處理後,將值傳入redirect
 
第一步 將callbackurl進行urlencode,形式以下:
 
第二步,將上面獲取到值再進行urlencode,形式以下:
 
 
好,如今再來看微信受權服務端的狀況,提供 weixinauthorize這服務的代碼應該怎麼寫呢
 
假如說 在程序中有如下的代碼 
$redirect = urldecode($_GET['redirect']);
 
那麼問題就發生了.
咱們原本是想獲得的$redirect的值 是 http://b.com/2.php?callbackurl=urlencode(http://c.com/3.php) 但最終咱們獲得的是  http://b.com/2.php?callbackurl=http://c.com/3.php 這個地址. 而這個地址是不工做的.
 
因此 咱們必需要要將上面的代碼中urldecode去掉
 
因爲我在工做中發生過這樣的錯誤.特別在這裏記錄一下.以避免遺忘.
 
以上都是個人一些猜想.可是經過這個理解,也能說明一些問題.因此我認爲個人這個猜想是正確的.若是有誰有更好的解釋,那麼也請告訴我.謝謝
相關文章
相關標籤/搜索