浅谈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 图片上添加透明度渐变的效果
Jun 29 PHP
解决PHP4.0 和 PHP5.0类构造函数的兼容问题
Aug 01 PHP
PHP curl 获取响应的状态码的方法
Jan 13 PHP
PHP使用适合阅读的格式显示文件大小的方法
Mar 05 PHP
php使用pclzip类实现文件压缩的方法(附pclzip类下载地址)
Apr 30 PHP
Yii2框架dropDownList下拉菜单用法实例分析
Jul 18 PHP
php实现登录tplink WR882N获取IP和重启的方法
Jul 20 PHP
详解Yii2 之 生成 URL 的方法
Jun 16 PHP
[企业公众号]升级到[企业微信]之后发送消息失败的解决方法
Jun 30 PHP
PHP读取并输出XML文件数据的简单实现方法
Dec 22 PHP
PHP缓存工具XCache安装与使用方法详解
Apr 09 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
Mar 24 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
YII路径的用法总结
2014/07/09 PHP
destoon实现调用当前栏目分类及子分类和三级分类的方法
2014/08/21 PHP
各种快递查询--Api接口
2016/04/26 PHP
PHP对称加密函数实现数据的加密解密
2016/10/27 PHP
html5的自定义data-*属性和jquery的data()方法的使用示例
2013/08/21 Javascript
jQuery实现用户注册的表单验证示例
2013/08/28 Javascript
js实现通用的微信分享组件示例
2014/03/10 Javascript
javascript中兼容主流浏览器的动态生成iframe方法
2014/05/05 Javascript
JavaScript中用toString()方法返回时间为字符串
2015/06/12 Javascript
JS实现图片平面旋转的方法
2016/03/01 Javascript
js实现复选框的全选和取消全选效果
2017/01/03 Javascript
详解webpack介绍&amp;安装&amp;常用命令
2017/06/29 Javascript
原生js实现简单的链式操作
2017/07/04 Javascript
JavaScript满天星导航栏实现方法
2018/03/08 Javascript
vue的style绑定background-image的方式和其他变量数据的区别详解
2018/09/03 Javascript
react 应用多入口配置及实践总结
2018/10/17 Javascript
微信小程序canvas.drawImage完全显示图片问题的解决
2018/11/30 Javascript
在Vue项目中引入JQuery-ui插件的讲解
2019/01/27 jQuery
移动端自适应flexible.js的使用方法(不用三大框架,仅写一个单html页面使用)推荐
2019/04/02 Javascript
layui 实现表格某一列显示图标
2019/09/19 Javascript
jQuery实时统计输入框字数及限制
2020/06/24 jQuery
推荐下python/ironpython:从入门到精通
2007/10/02 Python
python提取字典key列表的方法
2015/07/11 Python
python 实现检验33品种数据是否是正态分布
2019/12/09 Python
浅谈python元素如何去重,去重后如何保持原来元素的顺序不变
2020/02/28 Python
Python 线性回归分析以及评价指标详解
2020/04/02 Python
初探CSS3中的calc()功能
2015/07/14 HTML / CSS
HTML5之SVG 2D入门11—用户交互性(动画)介绍及应用
2013/01/30 HTML / CSS
GLAMGLOW香港官网:明星出镜前的秘密武器
2017/03/16 全球购物
应届生会计电算化求职信
2013/10/03 职场文书
珍珠奶茶店创业计划书
2014/01/11 职场文书
《奇妙的国际互联网》 教学反思
2014/02/25 职场文书
新学期红领巾广播稿
2014/10/04 职场文书
2015年驾驶员工作总结
2015/04/29 职场文书
MySQL外键约束(FOREIGN KEY)案例讲解
2021/08/23 MySQL
MySQL读取JSON转换的方式
2022/03/18 MySQL