设为首页 收藏本站
查看: 1105|回复: 0

[经验分享] js实现php函数urlencode

[复制链接]
发表于 2015-8-25 08:42:32 | 显示全部楼层 |阅读模式
  本文介绍了php函数urlencode的js实现方法并比较js和php各编码函数的区别。
  通常form表单的enctype类型为 application/x-www-form-urlencoded, 当表单提交后,提交的数据自动被编码, 规则为" 除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。", php的urlencode函数与其功能相同。
  js编码方法:escape, encodeURI, encodeURIComponent。
escape可以对大多数符号进行编码,但是对unicode字符无效。
  php编码方法:urlencode, rawurlencode, htmlentities。
urlencode和rawurlencode唯一的区别是对空格的编码方式不同,rawurlencode遵循RFC 1738编码将空格转换为 %20。
  如何用js实现php的urlencode功能, 网上流传着一段js和vbscript混写的代码,通用性不好,另找到国外一高人写的, 经测试与urlencode相同。

  

DSC0000.gif DSC0001.gif 代码

1 function URLEncode (clearString) {
2   var output = '';
3   var x = 0;
4   clearString = clearString.toString();
5   var regex = /(^[a-zA-Z0-9-_.]*)/;
6   while (x < clearString.length) {
7     var match = regex.exec(clearString.substr(x));
8     if (match != null && match.length > 1 && match[1] != '') {
9         output += match[1];
10       x += match[1].length;
11     } else {
12       if (clearString.substr(x, 1) == ' ') {
13         //原文在此用 clearString[x] == ' ' 做判断, 但ie不支持把字符串当作数组来访问,
14         //修改后两种浏览器都可兼容
15         output += '+';
16       }
17       else {
18         var charCode = clearString.charCodeAt(x);
19         var hexVal = charCode.toString(16);
20         output += '%' + ( hexVal.length < 2 ? '0' : '' ) + hexVal.toUpperCase();
21       }
22       x++;
23     }
24   }
25   return output;
26 }  
  注:上面的代码引自 http://cass-hacks.com/articles/code/js_url_encode_decode/
  下面附上js和php几种编码方法对特殊符号的编码对照表:
[tr]escapeencodeURIencodeURIComponenturlencoderawurlencodehtmlentities[/tr]    
InputJavaScriptPHP
<space>%20%20%20+%20
!%21!!%21%21!
@@@%40%40%40@
#%23#%23%23%23#
$%24$%24%24%24$
%%25%25%25%25%25%
^%5E%5E%5E%5E%5E^
&%26&%26%26%26&amp;
****%2A%2A*
(%28((%28%28(
)%29))%29%29)
-------
_______
=%3D=%3D%3D%3D=
+++%2B%2B%2B+
:%3A:%3A%3A%3A:
;%3B;%3B%3B%3B;;
.......
"%22%22%22%22%22&quot;
'%27''%27%27'
\%5C%5C%5C%5C%5C\
///%2F%2F%2F/
?%3F?%3F%3F%3F?
<%3C%3C%3C%3C%3C&lt;
>%3E%3E%3E%3E%3E&gt;
~%7E~~%7E%7E~
[%5B%5B%5B%5B%5B[
]%5D%5D%5D%5D%5D]
{%7B%7B%7B%7B%7B{
}%7D%7D%7D%7D%7D}
`%60%60%60%60%60`
  
  上表引自 http://www.the-art-of-web.com/javascript/escape/


  另一个非常优秀的urlencode和urldecode函数


代码

1 var Url = {
2  
3     // public method for url encoding
4     encode : function (string) {
5         return escape(this._utf8_encode(string));
6     },
7  
8     // public method for url decoding
9     decode : function (string) {
10         return this._utf8_decode(unescape(string));
11     },
12  
13     // private method for UTF-8 encoding
14     _utf8_encode : function (string) {
15         string = string.replace(/\r\n/g,"\n");
16         var utftext = "";
17  
18         for (var n = 0; n < string.length; n++) {
19  
20             var c = string.charCodeAt(n);
21  
22             if (c < 128) {
23                 utftext += String.fromCharCode(c);
24             }
25             else if((c > 127) && (c < 2048)) {
26                 utftext += String.fromCharCode((c >> 6) | 192);
27                 utftext += String.fromCharCode((c & 63) | 128);
28             }
29             else {
30                 utftext += String.fromCharCode((c >> 12) | 224);
31                 utftext += String.fromCharCode(((c >> 6) & 63) | 128);
32                 utftext += String.fromCharCode((c & 63) | 128);
33             }
34  
35         }
36  
37         return utftext;
38     },
39  
40     // private method for UTF-8 decoding
41     _utf8_decode : function (utftext) {
42         var string = "";
43         var i = 0;
44         var c = c1 = c2 = 0;
45  
46         while ( i < utftext.length ) {
47  
48             c = utftext.charCodeAt(i);
49  
50             if (c < 128) {
51                 string += String.fromCharCode(c);
52                 i++;
53             }
54             else if((c > 191) && (c < 224)) {
55                 c2 = utftext.charCodeAt(i+1);
56                 string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
57                 i += 2;
58             }
59             else {
60                 c2 = utftext.charCodeAt(i+1);
61                 c3 = utftext.charCodeAt(i+2);
62                 string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
63                 i += 3;
64             }
65  
66         }
67  
68         return string;
69     }
70  
71 }  
  
  
  今天又被QA发现了一个urlencode的bug, 对照了一下,上面第一个函数把 "-"(中线)丢了,网上的东西不能太过于相信了。不能简单的拿来主义,仔细检查后才能使用。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-103783-1-1.html 上篇帖子: PHP preg_match正则表达式的使用 下篇帖子: PHP统计在线人数
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表