zoukankan      html  css  js  c++  java
  • PHP中的urlencode,rawurlencode和JS中的encodeURI,encodeURIComponent

    PHP中的urlencode,rawurlencode和JS中的encodeURI,encodeURIComponent

    【PHP中的urlencode和rawurlencode】
    urlencode之前有看过其源码实现PHP 源码阅读笔记二十三 :urlencode函数
    二都的区别仅在” “空格上,rawurlencode()会把空格编码为%20,而urlencode会把空格编码为+

    【JS中的encodeURI和encodeURIComponent】
    encodeURI 方法不会对下列字符进行编码:”:”、”/”、”;” 和 “?”,而encodeURIComponent会编码这些字符

    【urlencode与encodeURI】
    首先,我们看下这4种编码方式针对ASCII的127个字符编码后的差别,显示代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    
    <?php
    /**
     * 生成urlencode,rawurlencode,encodeURI,encodeURIComponent的编码结果 2010-10-29 sz
     * @author phppan.p#gmail.com  http://www.phppan.com
     * 哥学社成员(http://www.blog-brother.com/)
     * @package test
     */
    header("Content-type:text/html;charset=utf-8");
     
    echo <<<STYLE
    <style type="text/css">
        table {
    cursor:default;
    font-family:Verdana,Helvetica,sans-serif;
    font-size:8pt;
    }
    td {
    background:none repeat scroll 0 0 #EFEFEF;
    text-align:center;
    100px;
    }
    </style>
    STYLE;
    echo '<table >';
    echo _tr(_td("ASCII") . _td("urlenocde") . _td("rawurlencode") . _td("encodeURI") . _td("encodeURIComponent"));
    for ($i = 0; $i < 128; $i++) {
        $ch = chr($i);
        $td = _td($ch) . _td(urlencode($ch)) . _td(rawurlencode($ch));
        $td .= _td(_encodeURI($ch)) . _td(_encodeURIComponent($ch));
     
        echo _tr($td);
    }
    echo "</table>";

    对比urlencode和encodeURI的不同,可以看到#$&+,/:;=?@这些符号编码结果不同,
    于是对于需要在PHP中编码后,给js的encodeURI使用的操作可以使用如下函数:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    
    <?php
    /**
     * urlencode适用于js版本 2010-10-29 sz
     * @author phppan.p#gmail.com  http://www.phppan.com
     * 哥学社成员(http://www.blog-brother.com/)
     * @package test
     */
    header("Content-type:text/html;charset=utf-8");
     
    function urlencode_js($str) {
        $str_len = strlen($str);
     
        $new = array();
        for ($i = 0; $i < $str_len; $i++) {
            $ch = $str[$i];
            if (strpos("#$&+,/:;=?@", $ch) !== FALSE) {
                $new[] = $ch;
            } else {
                $new[] = urlencode($ch);
            }
        }
     
        return implode("", $new);
    }
     
    $encode_str = urlencode_js("a汉bc中文 章+aa#$&+,/:;=?@a汉bc中文 章+aa");
     
    echo <<<HTML
    <script type="text/javascript">
        document.write(decodeURI("$encode_str") + "<br />");
     </script>
    HTML;
    die();

    【urlencode和urldecode的PHP实现】(折腾一个重复轮子玩)
    以下代码纯属折腾,如有雷同,不胜荣幸

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    
     
    <?php
    /**
     * urlencode和urldecode的PHP版本 2010-10-29 sz
     * @author phppan.p#gmail.com  http://www.phppan.com
     * 哥学社成员(http://www.blog-brother.com/)
     * @package test
     */
    header("Content-type:text/html;charset=utf-8");
     
    $str = "a汉bc中文 章+aa:/;?()'!-.*_~";
     
    /**
     * urlencode的PHP实现
     * 纯属折腾 其C实现请参照PHP源码  url.c文件中php_url_encode函数
     * @param <type> $str
     * @return <type>
     */
    function myurlencode($str) {
        $len = strlen($str);
     
        $rs = array();
        for ($i = 0; $i < $len; $i++) {
            $ch = $str[$i];
            if ($ch == ' ') {
                $rs[] = '+';
            } else if (!encodecheck($ch)) {
                $rs[] = strtoupper('%' . dechex(ord($ch) >> 4) . dechex(ord($ch) & 15));
            } else {
                $rs[] = $ch;
            }
        }
     
        return implode("", $rs);
    }
     
    /**
     * 判断是否为字符和字线以及_-.
     * 相当于c中的!isalnum(c) && strchr("_-.", c) == NULL(PHP源码)
     * @param <type> $ch
     * @return <type>
     */
    function encodecheck($ch) {
        $pattern = "/[a-zA-Z0-9_-.]/";
        return preg_match($pattern, strval($ch));
    }
     
    /**
     * 判断是否为16进制数
     * @param <type> $ch
     * @return <type>
     */
    function checkhex($ch) {
        $hexstr = "0123456789ABCDEF";
        return strpos($hexstr, strval($ch)) === FALSE ? FALSE : TRUE;
    }
     
    /**
     * urldecode的PHP实现
     * 纯属折腾
     * @param <type> $str
     * @return <type>
     */
    function myurldecode($str) {
        $len = strlen($str);
     
        $rs = array();
        for ($i = 0; $i < $len; $i++) {
            $ch = $str[$i];
            if ($ch == '+') {
                $rs[] = ' ';
            } else if ($ch == '%' && isset($str[$i + 1]) && checkhex($str[$i + 1]) && isset($str[$i + 2]) && checkhex($str[$i + 2])) {
                $rs[] = chr(hexdec($str[$i + 1] . $str[$i + 2]));
                $i += 2;
            } else {
                $rs[] = $ch;
            }
        }
     
        return implode("", $rs);
    }
     
    /* 测试 */
    echo $str, '<br />';
    echo urldecode(myurlencode($str)), '<br />';
    echo myurldecode(urlencode($str)), '<br />';
    die();

    以上算是对urlencode和urldecode实现的一次复习吧。

    –EOF–

  • 相关阅读:
    「SDOI2014」向量集 解题报告
    HNOI 2014 世界树
    LOJ #2205. 「HNOI2014」画框 解题报告
    KM模板
    洛谷 [HNOI2014]道路堵塞 解题报告
    [AHOI2014/JSOI2014] 解题报告
    AndroidStudio中添加依赖的三种方式以及如何引入so文件和arr文件
    android 四大组件详解
    Android—— ListView 的简单用法及定制ListView界面
    Android Studio 使用VCS版本控制
  • 原文地址:https://www.cnblogs.com/caicaizi/p/4948592.html
Copyright © 2011-2022 走看看