zoukankan      html  css  js  c++  java
  • php中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." "; 
    echo "urlencode 的结果: ".urlencode($asscii); 
    echo " "; 
    echo "urlencode 不做编码的字http://www.jb51.net/符: ".preg_replace("/%.{2}/","",urlencode($asscii)); 
    echo " "; 
    echo "rawurlencode 的结果: ".rawurlencode($asscii); 
    echo " "; 
    echo "rawurlencode 不做编码的字符: ".preg_replace("/%.{2}/","",rawurlencode($asscii)); 
    echo " ";
    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多编码一个”加号“

    关于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
    <?php
    echo iconv("utf-8","gbk",urldecode("%E7%BB%9F%E4%B8%80%E6%B3%A8%E5%86%8C1")); 
    echo " "; 
    echo urldecode("%u7EDF%u4E00%u6CE8%u518C1"); 
    // 使用下面的unescape可以
    //echo iconv("utf-8","gbk",unescape("%u7EDF%u4E00%u6CE8%u518C1"); 
    exit;
    ?>
    输出结果:
    ======================================
    统一注册1
    %u7EDF%u4E00%u6CE8%u518C1
    ======================================
    结果说明: 
    1. encodeURIComponent 总是把输入转换成utf8编码处理的,按字节编码

    2. escape是按照unicode编码处理的,因为它也对url中不安全的字符做了编码,所以也可以在url中做编码使用,但是,服务器端不会自动解码,下面提供一个PHP版的解码函数,是用手册里找的:

    <?php
    function unescape($str) { 
    $str = rawurldecode($str); 
    preg_match_all("/(?:%u.{4})|&#x.{4};|&#d+;|.+/U",$str,$r); 
    $ar = $r[0]; 
    foreach($ar as $k=>$v) { 
    if(substr($v,0,2) == "%u") 
    $ar[$k] = iconv("UCS-2","UTF-8",pack("H4",substr($v,-4))); 
    elseif(substr($v,0,3) == "&#x") 
    $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个

  • 相关阅读:
    Hadoop Combiner的三次测试...
    加了@Accessors(chain = true),copy实体类出现问题
    zookeeper启动:Could not find or load main class org.apache.zookeeper.server.quorum.
    CentOS7 更新yum源
    SpringBoot外部静态资源的访问
    从背包问题说起——初学者角度看背包问题
    C++ 常用STL数据类型总结归纳 简单易懂 入门 教程 array vector list deque map set stack
    1.4 HTML5新增的表单属性
    1.3 HTML5新增的input类型
    1.2 HTML5新增的多媒体标签
  • 原文地址:https://www.cnblogs.com/2881064178dinfeng/p/6208394.html
Copyright © 2011-2022 走看看