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去掉
 
因为我在工做中发生过这样的错误.特别在这里记录一下.以避免遗忘.
 
以上都是个人一些猜想.可是经过这个理解,也能说明一些问题.因此我认为个人这个猜想是正确的.若是有谁有更好的解释,那么也请告诉我.谢谢
相关文章
相关标签/搜索