您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

php中urlencode与rawurlencode的区别

2024/11/24 5:11:14发布172次查看
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 格式以免其被传输媒体(像一些邮件系统)使用字符转换时弄乱。下面我们来看一下例子:
 代码如下 复制代码
具体例子比较:
 代码如下 复制代码
输出结果:
———————————————————————————
所有的可打印的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
输出结果:
======================================
统一注册1
%u7edf%u4e00%u6ce8%u518c1
======================================
结果说明:
1. encodeuricomponent 总是把输入转换成utf8编码处理的,按字节编码
2. escape是按照unicode编码处理的,因为它也对url中不安全的字符做了编码,所以也可以在url中做编码使用,但是,服务器端不会自动解码,下面提供一个php版的解码函数,是用手册里找的:
$v) {
        if(substr($v,0,2) == %u)
            $ar[$k] = iconv(ucs-2,utf-8,pack(h4,substr($v,-4)));
        elseif(substr($v,0,3) == )
            $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个
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product