好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

php中urlencode与rawurlencode的区别 - php函数

php中urlencode与rawurlencode的区别

urlencode与rawurlencode函数是对url进行一些处理,但在处理时它们是有区别的,特别是对于些特殊字符时它们表现出来的是完全不一样的,下面我就来详细举例子来说明一下这两个url处理函数吧.

前段时间说自己遇到了个《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 不做编码的字符:\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多编码一个]加号[

查看更多关于php中urlencode与rawurlencode的区别 - php函数的详细内容...

  阅读:42次