当前位置:首页 > PHP教程 > PHP常见问题

浅谈php中urlencode与rawurlencode的区别

前段时间说自己遇到了个《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 不做编码的字http://www.jb51.net/符: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的区别就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持硕编程。



【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!