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–