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个字符编码后的差别,显示代码如下:
";
对比urlencode和encodeURI的不同,可以看到#$&+,/:;=?@这些符号编码结果不同,
于是对于需要在PHP中编码后,给js的encodeURI使用的操作可以使用如下函数:
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 "
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--