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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值