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; width: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–

发表评论

您的电子邮箱地址不会被公开。