前段时间说本身遇到了个《URL加号引起错误》的BUG,引发这个bug的缘由就是本身在URL中使用了 urlencode 函数,该函数会把空格转换成加号,这样就致使URL解析出错,而空格只有转换成 %20 才能够能够正常解析,这时咱们就须要使用 rawurlencode 函数。下面就介绍一下 urlencode 函数与 rawurlencode 函数的区别:php
urlencode 函数:安全
返回字符串,此字符串中除了 -_. 以外的全部非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。此编码与 WWW 表单 POST 数据的编码方式是同样的,同时与 application/x-www-form-urlencoded 的媒体类型编码方式同样。因为历史缘由,此编码在将空格编码为加号(+)方面与 RFC1738 编码(参见 rawurlencode())不一样。服务器
rawurlencode 函数:app
返回字符串,此字符串中除了 -_. 以外的全部非字母数字字符都将被替换成百分号(%)后跟两位十六进制数。这是在 » RFC 3986 中描述的编码,是为了保护原义字符以避免其被解释为特殊的 URL 定界符,同时保护 URL 格式以避免其被传输媒体(像一些邮件系统)使用字符转换时弄乱。下面咱们来看一下例子:函数
代码以下 | 复制代码 |
<?php编码 $string = "hello world";url echo urlencode($string) . '<br/>'; //输出:hello+world ?>.net |
具体例子比较:code
代码以下 | 复制代码 |
<?php $asscii = pack("H*",$str); exit; 输出结果: |
---------------------------------------------------------------------------------
比较两者的结果:
1. 数字、大小写字母都不编码
2. 减号、点号、下划线 三个不编码
3. rawurlencode比urlencode多编码一个”加号“
关于JavaScript中escape与encodeURIComponent的区别:
代码以下 | 复制代码 |
>>> console.log(encodeURIComponent("统一注册1")); %E7%BB%9F%E4%B8%80%E6%B3%A8%E5%86%8C1 <?php 输出结果: |
结果说明:
1. encodeURIComponent 老是把输入转换成utf8编码处理的,按字节编码
2. escape是按照unicode编码处理的,由于它也对url中不安全的字符作了编码,因此也能够在url中作编码使用,可是,服务器端不会自动解码,下面提供一个PHP版的解码函数,是用手册里找的:
<?php
代码以下 | 复制代码 |
function unescape($str) { ?>
>>> console.log(escape(" !\"#$%&'()*+,-./0123456789:;=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_abcdefghijklmnopqrstuvwxyz{|}~")); *+-./0123456789@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz |
结果比较:
escape未编码的字符: *+-./@_ 共7个
encodeURIComponent未编码的字符: !’()*-._~ 共9个