浅谈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 相关文章推荐
初次接触php抽象工厂模式(Elgg)
Mar 21 PHP
PHPWind与Discuz截取字符函数substrs与cutstr性能比较
Dec 05 PHP
深入file_get_contents与curl函数的详解
Jun 25 PHP
浅谈PHP解析URL函数parse_url和parse_str
Nov 11 PHP
php有效防止同一用户多次登录
Nov 19 PHP
php构造函数与析构函数
Apr 23 PHP
AJAX PHP无刷新form表单提交的简单实现(推荐)
Sep 09 PHP
php 时间time与日期date之间的使用详解及区别
Nov 07 PHP
thinkphp5框架实现的自定义扩展类操作示例
May 16 PHP
php+js实现的无刷新下载文件功能示例
Aug 23 PHP
php给数组赋值的实例方法
Sep 26 PHP
php框架CI(codeigniter)自动加载与自主创建对象操作实例分析
Jun 06 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在字符串中查找指定字符串并删除的代码
2008/10/02 PHP
探讨各种PHP字符串函数的总结分析
2013/06/05 PHP
Thinkphp使用mongodb数据库实现多条件查询方法
2014/06/26 PHP
CI(Codeigniter)的Setting增强配置类实例
2016/01/06 PHP
PHP实现通过strace定位故障原因的方法
2018/04/29 PHP
详解php伪造Referer请求反盗链资源
2019/01/24 PHP
WordPress JQuery处理沙发头像
2009/06/22 Javascript
iframe子页面获取父页面元素的方法
2013/11/05 Javascript
ParseInt函数参数设置介绍
2014/01/02 Javascript
jquery高级编程的最佳实践详解
2014/03/23 Javascript
jquery右下角自动弹出可关闭的广告层
2015/05/08 Javascript
javascript实现五星评价代码(源码下载)
2015/08/11 Javascript
论JavaScript模块化编程
2016/03/07 Javascript
JS递归遍历对象获得Value值方法技巧
2016/06/14 Javascript
jQuery绑定自定义事件的魔法升级版
2016/06/30 Javascript
AngularJS辅助库browserTrigger用法示例
2016/11/03 Javascript
详解JSONObject和JSONArray区别及基本用法
2017/10/25 Javascript
React+EggJs实现断点续传的示例代码
2020/07/07 Javascript
解决PyCharm中光标变粗的问题
2017/08/05 Python
利用标准库fractions模块让Python支持分数类型的方法详解
2017/08/11 Python
Python爬虫:url中带字典列表参数的编码转换方法
2019/08/21 Python
python 的numpy库中的mean()函数用法介绍
2020/03/03 Python
python-xpath获取html文档的部分内容
2020/03/06 Python
Python 如何在字符串中插入变量
2020/08/01 Python
HTML5不支持frameset的两种解决方法
2016/11/14 HTML / CSS
伦敦哈德森鞋:Hudson Shoes
2018/02/06 全球购物
莫斯科隐形眼镜网上商店:Linzi
2019/07/22 全球购物
体育专业个人求职信范文
2013/12/27 职场文书
创业资金计划书
2014/02/06 职场文书
大学生两会精神学习心得体会
2014/03/10 职场文书
安踏广告词改编版
2014/03/21 职场文书
2015年小学开学寄语
2015/02/27 职场文书
开会迟到检讨书范文
2015/05/06 职场文书
军事博物馆观后感
2015/06/05 职场文书
总结会主持词
2015/07/02 职场文书
Python测试框架pytest高阶用法全面详解
2022/06/01 Python