首页 > 开发 > PHP > 正文

浅谈php中urlencode与rawurlencode的区别

2024-05-04 22:52:55
字体:
来源:转载
供稿:网友

前段时间说自己遇到了个《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+worldecho rawurldecode($string) . '<br/>';//输出:hello%20world?> 

具体例子比较:

<?phpfor ($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 不做编码的字//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%7Eurlencode 不做编码的字符:+-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyzrawurlencode 的结果:%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%7Erawurlencode 不做编码的字符:-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz

比较二者的结果:

1.  数字、大小写字母都不编码

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表