平时在工作中经常要写 $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去掉
 
由于我在工作中发生过这样的错误.特别在这里记录一下.以免遗忘.
 
以上都是我的一些猜测.但是通过这个理解,也能说明一些问题.所以我认为我的这个猜测是正确的.如果有谁有更好的解释,那么也请告诉我.谢谢
 

PHP中的urlencode和urldecode的理解的更多相关文章

  1. Python 中的urlencode和urldecode

    python中的urlencode与urldecode 发表于2013/11/13 16:04:09  79983人阅读 分类: python 当url地址含有中文,或者参数有中文的时候,这个算是很正 ...

  2. python中的urlencode和urldecode

    python将字符串转化成urlencode ,或者将url编码字符串decode的方法: 方法1: urlencode:urllib中的quote方法 >>> from urlli ...

  3. Python3中的urlencode和urldecode

    在Python3中,将中文进行urlencode编码使用函数 urllib.parse.quote(string, safe='/', encoding=None, errors=None) 而将编码 ...

  4. C#中实现UrlEncode和UrlDecode

    有时需要进行url编码.解码,比如从html中捞数据,有可能>.&等字符会被编码成>等. WinForm中默认没有引入System.Web,因此要现在项目中引入依赖 System. ...

  5. python中的urlencode与urldecode

    当url地址含有中文,或者参数有中文的时候,这个算是很正常了,但是把这样的url作为参数传递的时候(最常见的callback),需要把一些中文甚至'/'做一下编码转换. 所以对于一些中文或者字符,ur ...

  6. php中urlencode和urldecode的用法

    URLEncode:是指针对网页url中的中文字符的一种编码转化方式,最常见的就是Baidu.Google等搜索引擎中输入中文查询时候,生成经过Encode过的网页URL.URLEncode的方式一般 ...

  7. php中urlencode()和urldecode()URL编码函数浅析[转]

    URLEncode:是指针对网页url中的中文字符的一种编码转化方式,最常见的就是Baidu.Google等搜索引擎中输入中文查询时候,生成经过Encode过的网页URL.URLEncode的方式一般 ...

  8. java中URLEncode和URLDecode

    URLEncode和URLDecode用于完成普通字符串和 application/x-www-from-urlencoded MIME字符串之间的相互转化 如果传递的字符串中包含非西欧字符的字符串, ...

  9. python中urllib的urlencode与urldecode

    当url地址含有中文,或者参数有中文的时候,这个算是很正常了,但是把这样的url作为参数传递的时候(最常见的callback),需要把一些中文甚至'/'做一下编码转换. urlencode urlli ...

随机推荐

  1. SecureCRT恢复默认字体

    1\要想永久的改变的就跟我来吧,选项--全局选项--常规--默认会话--编辑默认设置--外观--当前颜色方案--选择自己喜欢的方案就行啦,然后选择保存就OK啦方案二: 自从装了Win7之后,觉得sec ...

  2. 【转】Hibernate映射机制之XXX.hbm.xml

    http://blog.csdn.net/a9529lty/article/details/6454924[注意多对一中“多”和“一”各自的java文件.xml文件的书写格式] 另外两篇总结:http ...

  3. PHPinstanceof filal这几个关键字的使用

    instanceof表示属不属于的意思 eg: class person{} class Student extends person{} $s=new person(); $st=new stude ...

  4. sizeof strlen strncpy用法总结 结构体实际所占内存大小 以及memset用法

    sizeof测类型(数组名除外) strlen测实际长度 strncpy返回指针类型 #include <stdio.h> #include <stdlib.h> #inclu ...

  5. iOS tableview 静态表布局纪录

    今天使用了tableview静态表布局,纪录如下 1:使用tableview 静态表,必须是UITableViewController 2:Content 中选择 Static Cells 如下图 3 ...

  6. php插件机制实现原理

    插件,亦即Plug-in,是指一类特定的功能模块(通常由第三方开发者实现) 它的特点: 1. 随时安装.卸载.激活.禁用 2. 无论什么状态都不影响系统核心模块的运行, 3. 是一种非侵入式的模块化设 ...

  7. sea.js 学习

    开篇:终于学习了sea.js的使用了,因为它是一个模块加载工具,所以首先要了解javascript的模块编程,然后对sea.js的了解和使用 javascript 模块编程 为什么要模块化编程,为了让 ...

  8. Log4Net 在多层项目中的使用小记

    原文地址:http://www.cnblogs.com/zdh8675/p/3645556.html 这几天刚好在调整一个项目,把一些自己不是很清楚的东西先试验一下,这篇文章主要是对我在项目中需要使用 ...

  9. OLEDB读取EXCEL表格时,某些字段为空,怎么办?

    转载:http://blog.sina.com.cn/s/blog_53864cba01011cbn.html   前些日子,写了一个Excel导入数据库的共同Batch,突然有一天发现当我修改Exc ...

  10. IniParse解析类

    说明 iniParse这个类是一个解析ini文件的类,他的功能和Windows下GetPrivateProfileString的功能一样,可以很方便的保存读取配置. 当然他不是只有GetPrivate ...