zoukankan      html  css  js  c++  java
  • PHP rawurlencode()和urlencode()函数区别

    来源一:http://hi.baidu.com/jiang_killer/item/041ca6d05329d7362b35c795

    rawurlencode遵守是94年国际标准备忘录RFC 1738
    urlencode实现的是传统做法,和上者的主要区别是对空格的转义是'+'而不是'%20'
    javascript的encodeURL也是94年标准,

    而javascript的escape是另一种用"%xxx"标记unicode编码的方法。

    推荐在PHP中使用用rawurlencode。弃用urlencode

    样例
    source:

    超级无敌的人sadha sajdh数据样本sdls fhejrthcxzb.file.jpeg

    PHP urlencode:

    %E8%B6%85%E7%BA%A7%E6%97%A0%E6%95%8C%E7%9A%84%E4%BA%BAsadha+sajdh%E6%95%B0%E6%8D%AE%E6%A0%B7%E6%9C%ACsdls+fhejrthcxzb.file.jpeg

    PHP rawurlencode:

    %E8%B6%85%E7%BA%A7%E6%97%A0%E6%95%8C%E7%9A%84%E4%BA%BAsadha%20sajdh%E6%95%B0%E6%8D%AE%E6%A0%B7%E6%9C%ACsdls%20fhejrthcxzb.file.jpeg

    Javascript encodeURI:

    %E8%B6%85%E7%BA%A7%E6%97%A0%E6%95%8C%E7%9A%84%E4%BA%BAsadha%20sajdh%E6%95%B0%E6%8D%AE%E6%A0%B7%E6%9C%ACsdls%20fhejrthcxzb.file.jpeg

    Javascript escape:

    %u8D85%u7EA7%u65E0%u654C%u7684%u4EBAsadha%20sajdh%u6570%u636E%u6837%u672Csdls%20fhejrthcxzb.file.jpeg


    其PHP 手册描述为:

    rawurlencode -- 按照 RFC 1738 对 URL 进行编码描述string rawurlencode ( string str )

    返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数。这是在 RFC 1738 中描述的编码,是为了保护原义字符以免其被解释为特殊的 URL 定界符,同时保护 URL 格式以免其被传输媒体(像一些邮件系统)使用字符转换时弄乱。例如,如果你想在 FTP 的 URL 中包含密码:

    例子 1. rawurlencode() 示例 1

    <?php
    echo '<a href="ftp://user:', rawurlencode('foo @+%/'),
         '@ftp.example.com/x.txt">';
    ?>

    或者,如果你想通过 URL 的 PATH_INFO 构成部分去传递信息:

    例子 2. rawurlencode() 示例 2

    <?php
    echo '<a href="http://example.com/department_list_script/',
        rawurlencode('sales and marketing/Miami'), '">';
    ?>

    urlencode -- 编码 URL 字符串

    描述string urlencode ( string str )

    返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。此编码与 WWW 表单 POST 数据的编码方式是一样的,同时与 application/x-www-form-urlencoded 的媒体类型编码方式一样。由于历史原因,此编码在将空格编码为加号(+)方面与 RFC1738 编码(参见 )不同。此函数便于将字符串编码并将其用于 URL 的请求部分,同时它还便于将变量传递给下一页:

    例子 1. urlencode() 示例

    <?php
    echo '<a href="mycgi?foo=', urlencode($userinput), '">';
    ?>

    注意:小心与 HTML 实体相匹配的变量。像 &amp、&copy 和 &pound 都将被浏览器解析,并使用实际实体替代所期待的变量名。这是明显的混乱,W3C 已经告诫人们好几年了。参考地址:http://www.w3.org/TR/html4/appendix/notes.html#h-B.2.2 PHP 通过 arg_separator .ini 指令,支持将参数分割符变成 W3C 所建议的分号。不幸的是大多数用户代理并不发送分号分隔符格式的表单数据。较为简单的解决办法是使用 &amp; 代替 & 作为分隔符。你不需要为此修改 PHP 的 arg_separator。让它仍为 &,而仅使用 htmlentities(urlencode($data)) 对你的 URL 进行编码。

    例子 2. urlencode() 与 示例

    <?php
    echo '<a href="mycgi?foo=', htmlentities(urlencode($userinput)), '">';
    ?>

    =======================================

    来源二:http://blog.csdn.net/amonest/article/details/6431183

    昨天看UCHome源码的时候,发现有些地方用urlencode,有些地方用rawurlencode。由于对这两个方法的差异不是很清楚,特意写了一段代码来测试。

    请将下面的代码保存到一个PHP文件中:

    1. <?php  
    2. test_encode('http://www.baidu.com?a=search&k=eclipse');  
    3. test_encode(':/?= &#');  
    4. test_encode('中文');  
    5. function test_encode($s)  
    6. {  
    7.   echo "<b>urlencode('$s')</b> = [<b>";  
    8.   var_dump(urlencode($s));    
    9.   echo "</b>]<br/>";  
    10.   echo "<b>rawurlencode('$s')</b> = [<b>";  
    11.   var_dump(rawurlencode($s));    
    12.   echo "</b>]<br/>";  
    13. }  

    上面代码执行结果如下:

    1. urlencode('http://www.baidu.com?a=search&k=eclipse') = [string(53) "http%3A%2F%2Fwww.baidu.com%3Fa%3Dsearch%26k%3Declipse" ]  
    2. rawurlencode('http://www.baidu.com?a=search&k=eclipse') = [string(53) "http%3A%2F%2Fwww.baidu.com%3Fa%3Dsearch%26k%3Declipse" ]  
    3. urlencode(':/?= &#') = [string(19) "%3A%2F%3F%3D+%26%23" ]  
    4. rawurlencode(':/?= &#') = [string(21) "%3A%2F%3F%3D%20%26%23" ]  
    5. urlencode('中文') = [string(18) "%E4%B8%AD%E6%96%87" ]  
    6. rawurlencode('中文') = [string(18) "%E4%B8%AD%E6%96%87" ]  

    从上面的执行结果可以看出,urlencode和rawurlencode两个方法在处理字母数字,特殊符号,中文的时候结果都是一样的,唯一的不同是对空格的处理,urlencode处理成“+”,rawurlencode处理成“%20”。


    看看PHP Manual对两个函数的说明:

    urlencode:返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。此编码与 WWW 表单 POST 数据的编码方式是一样的,同时与 application/x-www-form-urlencoded 的媒体类型编码方式一样。由于历史原因,此编码在将空格编码为加号(+)方面与 RFC1738 编码(参见 rawurlencode())不同。

    rawurlencode:返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数。这是在 RFC 1738 中描述的编码,是为了保护原义字符以免其被解释为特殊的 URL 定界符,同时保护 URL 格式以免其被传输媒体(像一些邮件系统)使用字符转换时弄乱。

    ==========================================================================

    来源三:http://hi.baidu.com/liapiao/item/a15f32c929db5713515058ad

    rawurlencode 现在按 RFC 3986编码,php5.3.0之前遵守是94年国际标准备忘录 RFC 1738 。

    urlencode实现的是传统做法,和上者的主要区别是对空格的转义是'+'而不是'%20',此编码与 WWW 表单 POST 数据的编码方式是一样的,同时与application/x-www-form-urlencoded的媒体类型编码方式一样。

    javascript的encodeURL也是94年标准,而javascript的escape是另一种用"%xxx"标记unicode编码的方法,即符值大于 255 的字符以 %uxxxx 格式存储。

    推荐在PHP中使用用rawurlencode。弃用urlencode 。

    啥叫URL编码:除了-_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数

    RFC 3986增加为 除了-_.~ 四个字符  之外

    -----------------------------------------------------------------------------------------

    GET截断时用%00,那么COOKIE和POST怎么截断?

    不是二进制改00,还是%00,因为GPC都是urlencode编码方式,

    而multipart/form-data才是二进制编码,才需要改00

    form设置了enctype="multipart/form-data"  属性后,就是2进制传输数据了 

    form里面的input的值传过去的不过是以2进制的方式,所以request就得不到值了。一般可以利用组件来读去input的值.

    ==============================================================================

    来源四:http://blog.csdn.net/suofiya2008/article/details/6397168

    rawurlencode遵守是94年国际标准备忘录RFC 1738,
    urlencode实现的是传统做法,和上者的主要区别是对空格的转义是'+'而不是'%20'
    javascript的encodeURL也是94年标准,
    
    而javascript的escape是另一种用"%xxx"标记unicode编码的方法。
    
    推荐在PHP中使用用rawurlencode。弃用urlencode
    
    样例
    source:
    
    超级无敌的人sadha sajdh数据样本sdls fhejrthcxzb.file.jpeg
    
    PHP urlencode:
    
    %E8%B6%85%E7%BA%A7%E6%97%A0%E6%95%8C%E7%9A%84%E4%BA%BAsadha+sajdh%E6%95%B0%E6%8D%AE%E6%A0%B7%E6%9C%ACsdls+fhejrthcxzb.file.jpeg
    
    PHP rawurlencode:
    
    %E8%B6%85%E7%BA%A7%E6%97%A0%E6%95%8C%E7%9A%84%E4%BA%BAsadha%20sajdh%E6%95%B0%E6%8D%AE%E6%A0%B7%E6%9C%ACsdls%20fhejrthcxzb.file.jpeg
    
    Javascript encodeURI:
    
    %E8%B6%85%E7%BA%A7%E6%97%A0%E6%95%8C%E7%9A%84%E4%BA%BAsadha%20sajdh%E6%95%B0%E6%8D%AE%E6%A0%B7%E6%9C%ACsdls%20fhejrthcxzb.file.jpeg
    
    Javascript escape:
    
    %u8D85%u7EA7%u65E0%u654C%u7684%u4EBAsadha%20sajdh%u6570%u636E%u6837%u672Csdls%2

    ===================================================

    来源五:http://hi.baidu.com/lli351/item/e8bd77cae03a4b2e46d5c0cf

    PHP函数urlencode和rawurlencode
    
    信息检索流程:客户端浏览器填写表单--->提交--->apache服务器接收,送给php页面处理--->php页面把请求转给后台检索系统--->后台检索系统返回结果给php--->php生成结果页面,返回给浏览器显示。
    
    生成的结果如果太多,就要有“上一页”、“下一页”等链接进行遍历,对应的链接中必须有最初提交的查询字符串,比如“http://serverpath/search.php?query=王昭君”中的“王昭君”。
    
    由于字符编码标准很多,跟汉字相关的有gb2312,gbk,big5,utf-8,utf-16等,考虑到互联网上页面包括各种语言和特殊字符,搜索引擎内部通常采用宽字符进行处理,因此牵扯到各种编码方式之间的转换,当然会有相应的函数进行处理。
    
    我们实现系统的时候发现一个问题,上述链接在IE浏览器中会出现问题,导致传给后端的查询字符串是乱码。一般来说,浏览器在处理url的时候,会把字符串进行编码,除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数。在IE浏览器中,使用页面中的这种链接把查询字符串传回给服务器时,有时候会出现解析失败的现象,而在Firefox中则没有这个问题。
    
    在PHP字符串函数中有相关的处理函数urlencode和rawurlencode可以完成这方面的功能,其中后者采用RFC1738 编码,而前者会把空格转换成加号(+),其编码与 WWW 表单 POST 数据的编码方式是一样的,同时与 application/x-www-form-urlencoded 的媒体类型编码方式一样,从而能够保证传递到服务器端的字符串正确进行解析。
    
    通过在php页面中显式使用urlencode函数就可以避免IE中时灵时不灵的编码问题了。
  • 相关阅读:
    剑指 Offer——13. 调整数组顺序使奇数位于偶数前面
    剑指 Offer——3. 从尾到头打印链表
    剑指 Offer——2. 替换空格
    剑指 Offer——1. 二维数组中的查找
    LeetCode 905. Sort Array By Parity 按奇偶校验排列数组
    LeetCode 448. Find All Numbers Disappeared in an Array找到所有数组中消失的元素
    SSH 代码笔记
    anaconda3安装caffe
    opencv多版本安装
    人脸文章与数据库
  • 原文地址:https://www.cnblogs.com/radphp/p/2976853.html
Copyright © 2011-2022 走看看