← 回到文章

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个字符编码后的差别,显示代码如下:
    table {
cursor:default;
font-family:Verdana,Helvetica,sans-serif;
font-size:8pt;
}
td {
background:none repeat scroll 0 0 #EFEFEF;
text-align:center;
width:100px;
}

STYLE;
echo '';
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 "
";
对比urlencode和encodeURI的不同,可以看到#$&+,/:;=?@这些符号编码结果不同, 于是对于需要在PHP中编码后,给js的encodeURI使用的操作可以使用如下函数:
    document.write(decodeURI("$encode_str") + "
"); HTML; die();
【urlencode和urldecode的PHP实现】(折腾一个重复轮子玩) 以下代码纯属折腾,如有雷同,不胜荣幸
 $str
 * @return 
 */
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  $ch
 * @return 
 */
function encodecheck($ch) {
    $pattern = "/[a-zA-Z0-9_\-\.]/";
    return preg_match($pattern, strval($ch));
}

/**
 * 判断是否为16进制数
 * @param  $ch
 * @return 
 */
function checkhex($ch) {
    $hexstr = "0123456789ABCDEF";
    return strpos($hexstr, strval($ch)) === FALSE ? FALSE : TRUE;
}

/**
 * urldecode的PHP实现
 * 纯属折腾
 * @param  $str
 * @return 
 */
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, '
'; echo urldecode(myurlencode($str)), '
'; echo myurldecode(urlencode($str)), '
'; die();
以上算是对urlencode和urldecode实现的一次复习吧。 --EOF--
最后更新于 2010-10-29 13:54:00