您好,欢迎访问一九零五行业门户网

js实现php函数urlencode

本文介绍了php函数urlencode的js实现方法并比较js和php各编码函数的区别。 通常form表单的enctype类型为 application/x-www-form-urlencoded, 当表单提交后,提交的数据自动被编码, 规则为 除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两
本文介绍了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相同。
代码
 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几种编码方法对特殊符号的编码对照表:
input javascript php
 escapeencodeuriencodeuricomponenturlencoderawurlencodehtmlentities
%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 &
* * * * %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
' %27 ' ' %27 %27 '
\ %5c %5c %5c %5c %5c \
/ / / %2f %2f %2f /
? %3f ? %3f %3f %3f ?
%3c %3c %3c %3c %3c <
> %3e %3e %3e %3e %3e >
~ %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 }
其它类似信息

推荐信息