浅谈php中urlencode与rawurlencode的区别


Posted in PHP onSeptember 05, 2016

前段时间说自己遇到了个《URL加号引发错误》的BUG,引起这个bug的原因就是自己在URL中使用了 urlencode 函数,该函数会把空格转换成加号,这样就导致URL解析出错,而空格只有转换成 %20 才可以可以正常解析,这时我们就需要使用 rawurlencode 函数。

下面就介绍一下 urlencode 函数与 rawurlencode 函数的区别:

urlencode 函数:

返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。此编码与 WWW 表单 POST 数据的编码方式是一样的,同时与 application/x-www-form-urlencoded 的媒体类型编码方式一样。由于历史原因,此编码在将空格编码为加号(+)方面与 RFC1738 编码(参见 rawurlencode())不同。

rawurlencode 函数:

返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数。这是在 » RFC 3986 中描述的编码,是为了保护原义字符以免其被解释为特殊的 URL 定界符,同时保护 URL 格式以免其被传输媒体(像一些邮件系统)使用字符转换时弄乱。下面我们来看一下例子:

<?php

$string = "hello world";

echo urlencode($string) . '<br/>'; //输出:hello+world
echo rawurldecode($string) . '<br/>';//输出:hello%20world

?>

具体例子比较:

<?php
for ($i = 0x20; $i < 0x7f; $i++) { 
$str .= dechex($i); 
}

$asscii = pack("H*",$str); 
echo "所有的可打印的asscii字符:(从空格到~)n". $asscii."\n"; 
echo "urlencode 的结果:\n".urlencode($asscii); 
echo "\n"; 
echo "urlencode 不做编码的字https://3water.com/符:\n".preg_replace("/%.{2}/","",urlencode($asscii)); 
echo "\n"; 
echo "rawurlencode 的结果:\n".rawurlencode($asscii); 
echo "\n"; 
echo "rawurlencode 不做编码的字符:\n".preg_replace("/%.{2}/","",rawurlencode($asscii)); 
echo "\n";

exit;
?>

输出结果:
———————————————————————————
所有的可打印的asscii字符:(从空格到~)
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_abcdefghijklmnopqrstuvwxyz{|}~
urlencode 的结果:
+%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D%7E
urlencode 不做编码的字符:
+-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz
rawurlencode 的结果:
%20%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D%7E
rawurlencode 不做编码的字符:
-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz

比较二者的结果:

1.  数字、大小写字母都不编码
2.  减号、点号、下划线  三个不编码
3. rawurlencode比urlencode多编码一个”加号“

关于JavaScript中escape与encodeURIComponent的区别:

>>> console.log(encodeURIComponent("统一注册1"));

%E7%BB%9F%E4%B8%80%E6%B3%A8%E5%86%8C1
>>> console.log(escape("统一注册1"));
%u7EDF%u4E00%u6CE8%u518C1

<?php
echo iconv("utf-8","gbk",urldecode("%E7%BB%9F%E4%B8%80%E6%B3%A8%E5%86%8C1")); 
echo "\n"; 
echo urldecode("%u7EDF%u4E00%u6CE8%u518C1"); 
// 使用下面的unescape可以
//echo iconv("utf-8","gbk",unescape("%u7EDF%u4E00%u6CE8%u518C1"); 
exit;
?>

输出结果:
======================================
统一注册1
%u7EDF%u4E00%u6CE8%u518C1
======================================

结果说明:

1. encodeURIComponent 总是把输入转换成utf8编码处理的,按字节编码

2. escape是按照unicode编码处理的,因为它也对url中不安全的字符做了编码,所以也可以在url中做编码使用,但是,服务器端不会自动解码,下面提供一个PHP版的解码函数,是用手册里找的:

<?php

function unescape($str) { 
  $str = rawurldecode($str); 
  preg_match_all("/(?:%u.{4})|&#x.{4};|&#d+;|.+/U",$str,$r); 
  $ar = $r[0]; 
  foreach($ar as $k=>$v) { 
    if(substr($v,0,2) == "%u") 
      $ar[$k] = iconv("UCS-2","UTF-8",pack("H4",substr($v,-4))); 
    elseif(substr($v,0,3) == "&#x") 
      $ar[$k] = iconv("UCS-2","UTF-8",pack("H4",substr($v,3,-1))); 
    elseif(substr($v,0,2) == "&#") { 
      $ar[$k] = iconv("UCS-2","UTF-8",pack("n",substr($v,2,-1))); 
    } 
  } 
  return join("",$ar); 
}

?>

 

>>> console.log(escape(" !\"#$%&'()*+,-./0123456789:;=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_abcdefghijklmnopqrstuvwxyz{|}~"));
%20%21%22%23%24%25%26%27%28%29*+%2C-./0123456789%3A%3B%3C%3D%3E%3F@ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D%7E
>>> console.log(encodeURIComponent("!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_abcdefghijklmnopqrstuvwxyz{|}~"));
%20!%22%23%24%25%26'()*%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D~
>>> console.log(escape("!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_abcdefghijklmnopqrstuvwxyz{|}~").replace(/%.{2}/g,""));

*+-./0123456789@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz
>>> console.log(encodeURIComponent("!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~").replace(/%.{2}/g,""));
!'()*-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~

结果比较:

escape未编码的字符: *+-./@_   共7个

encodeURIComponent未编码的字符: !'()*-._~  共9个

以上这篇浅谈php中urlencode与rawurlencode的区别就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
图片存储与浏览一例(Linux+Apache+PHP+MySQL)
Oct 09 PHP
PHP 数组实例说明
Aug 18 PHP
PHP文件打开、关闭、写入的判断与执行代码
May 24 PHP
基于CakePHP实现的简单博客系统实例
Jun 28 PHP
PHP实现无限级分类(不使用递归)
Oct 22 PHP
微信自定义分享php代码分析
Nov 24 PHP
详谈PHP中public,private,protected,abstract等关键字的用法
Dec 31 PHP
php递归函数怎么用才有效
Feb 24 PHP
Ubuntu中支持PHP5与PHP7双版本的简单实现
Aug 19 PHP
微信推送功能实现方式图文详解
Jul 12 PHP
thinkphp5.1框架实现格式化mysql时间戳为日期的方式小结
Oct 10 PHP
PHP dirname功能及原理实例解析
Oct 28 PHP
浅谈mysql_query()函数的返回值问题
Sep 05 #PHP
PHP针对多用户实现更换头像功能
Sep 04 #PHP
PHP加密技术的简单实现
Sep 04 #PHP
PHP简单检测网址是否能够正常打开的方法
Sep 04 #PHP
PHP简单字符串过滤方法示例
Sep 04 #PHP
windows7配置Nginx+php+mysql的详细教程
Sep 04 #PHP
使用ThinkPHP的自动完成实现无限级分类实例详解
Sep 02 #PHP
You might like
在php MYSQL中插入当前时间
2008/04/06 PHP
PHP伪静态页面函数附使用方法
2008/06/20 PHP
php下通过IP获取地理位置的代码(小偷程序)
2011/06/09 PHP
用PHP书写安全的脚本代码
2012/02/05 PHP
解析php file_exists无效的解决办法
2013/06/26 PHP
php对二维数组进行相关操作(排序、转换、去空白等)
2015/11/04 PHP
Linux系统下使用XHProf和XHGui分析PHP运行性能
2015/12/08 PHP
PHP简单处理表单输入的特殊字符的方法
2016/02/03 PHP
PHP类的特性实例分析
2016/09/28 PHP
用js实现预览待上传的本地图片
2007/03/15 Javascript
JS禁用浏览器退格键实现思路及代码
2013/10/29 Javascript
jquery iframe操作详细解析
2013/11/20 Javascript
jquery跨域请求示例分享(jquery发送ajax请求)
2014/03/25 Javascript
JavaScript中length属性的使用方法
2015/06/05 Javascript
谈谈对JavaScript原生拖放的深入理解
2016/09/20 Javascript
简单实现js放大镜效果
2017/07/24 Javascript
jQuery模拟爆炸倒计时功能实例代码
2017/08/21 jQuery
详解node.js的http模块实例演示
2018/07/12 Javascript
Bootstrap 实现表格样式、表单布局的实例代码
2018/12/09 Javascript
对layui中table组件工具栏的使用详解
2019/09/19 Javascript
[45:16]完美世界DOTA2联赛PWL S3 Magma vs Phoenix 第一场 12.12
2020/12/16 DOTA
Python使用paramiko操作linux的方法讲解
2019/02/25 Python
Django REST framework内置路由用法
2019/07/26 Python
Python selenium的基本使用方法分析
2019/12/21 Python
小程序瀑布流解决左右两边高度差距过大的问题
2019/02/20 HTML / CSS
Lookfantastic法国官网:英国知名美妆购物网站
2017/10/28 全球购物
linux面试题参考答案(6)
2016/06/23 面试题
优秀大学生职业生涯规划书
2014/02/27 职场文书
毕业生自荐信格式
2014/03/07 职场文书
县委班子四风对照检查材料思想汇报
2014/09/29 职场文书
小学生作文评语集锦
2014/12/25 职场文书
2015年校务公开工作总结
2015/05/26 职场文书
申请吧主发表的感言
2015/08/03 职场文书
2016廉洁教育心得体会
2016/01/20 职场文书
默认网关不可用修复后过一会又不好使了解决方法
2022/04/08 数码科技
Windows Server 2019 配置远程控制以及管理方法
2022/04/28 Servers