本文介绍了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编码将空格转换为 。
如何用js实现php的urlencode功能, 网上流传着一段js和vbscript混写的代码,通用性不好,另找到国外一高人写的, 经测试与urlencode相同。
代码
1 函数 URLEncode (clearString) {
2 var 输出 = '';
3 var x = 0 ;
4 clearString = clearString.toString();
5 var 正则表达式 = / (^[a-zA-Z0-9-_.]*)/;
6 while (x clearString.length) {
7 var 匹配 = regex.exec(clearString.substr(x) );
8 如果 (匹配!= null && match.length > 1 && 匹配[1] != '') {
9 输出 += 匹配[1];
10 x += 匹配[1].length;
11 } 其他 {
12 if (clearString.substr(x, 1) == ' ') {
13 //文在此用 clearString[x] == ' ' 做判断,但不支持把字符串当作阵列来访问,
14 //修改后两个浏览器都可兼容
15 输出 += '+';
16 }
17 其他 {
18 var charCode = clearString.charCodeAt(x);
19 var hexVal = charCode.toString( 16);
20 输出 += '%' + ( hexVal.length 2 ? '0' : '' ) + hexVal.toUpperCase();
21 }
22 x++;
23 }
24 }
25 返回 输出;
26 }
注:上面的代码引自 http://cass-hacks.com/articles/code/js_url_encode_decode/
下面附上js和php几种编码方法对特殊符号的编码对照表:
Input | JavaScript | PHP | ||||
escape | encodeURI | encodeURIComponent | urlencode | rawurlencode | htmlentities | |
---|---|---|---|---|---|---|
%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 网址= {
2
3 // url 编码的公共方法
4 编码: 函数(字符串){
5 返回 转义(这个._utf8_encode(string));
6 },
7
8 // 网址解码的公共方法
9 解码: 函数(字符串){
10 返回 这个._utf8_decode(unescape(string));
11 },
12
13 // UTF-8 编码的私有方法
14 _utf8_encode : 函数(字符串){
15 字符串 = string.replace(/rn/g,"n");
16 var utftext = "";
17
18 对于 (var n = 0; n string.length; n++) {
19
20 var c = string.charCodeAt(n);
21
22 如果 (c 128) {
23 utftext += String.fromCharCode(c);
24 }
25 否则 if((c > 127) && (c 2048)) {
26 utftext += String.fromCharCode((c >> 6) | 192);
27 utftext += String.fromCharCode((c & 63) | 128);
28 }
29 其他 {
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 返回 utftext;
38 },
39
40 // UTF-8 解码的私有方法
41 _utf8_decode : 函数(utftext){
42 var 字符串 = "";
43 var i = 0 ;
44 var c = c1 = c2 = 0;
45
46 while (i utftext.length ) {
47
48 c = utftext.charCodeAt(i);
49
50 如果 (c 128) {
51 字符串 += String.fromCharCode(c);
52 我++;
53 }
54 否则 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 其他 {
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 返回 字符串;
69 }
70
71 }