用JS解码PHP的urlencode编码
做项目,需要用JS接收PHP用urlencode编码过来的数据。但JS的编码、解码方法里,decodeURI和PHP的urlencode方法不同,无法对PHP的urlencode进行解码。上网搜了搜,发现许多人问这个问题,解决方法是需要自己写一个JS的urlencode解码函数,了解PHP的urlencode编码算法后反向用JS解码。
网上有几段写好的半JS版urldecode,但都需要用到VBscript,可是FF不支持VBscript,也就意味着会不兼容FF。找了半天纯JS版的也没有。
JS+VBscript混合版的urldecode: 复制内容到剪贴板 代码:VBscript:
Function str2asc(strstr)
str2asc = hex(asc(strstr))
End Function
Function asc2str(ascasc)
asc2str = chr(ascasc)
End Function
JS:
function URLencode(str) {
var ret = "";
var strSpecial = "!\"#$%&'()*+,/:;<=>?[]^`{|}~%";
var tt= "";
for(var i=0;i<str.length;i++) {
var chr = str.charAt(i);
var c = str2asc(chr);//这里用到了VBscript
tt += chr+":"+c+"n";
if(parseInt("0x"+c) > 0x7f) {
ret += "%"+c.slice(0,2)+"%"+c.slice(-2);
}else {
if(chr == " ") ret += "+";
else if(strSpecial.indexOf(chr)!=-1) ret += "%"+c.toString(16);
else ret += chr;
}
}
return ret;
}
function URLdecode(str) {
var ret = "";
for(var i=0;i<str.length;i++) {
var chr = str.charAt(i);
if(chr == "+") {
ret += " ";
}else if(chr=="%") {
var asc = str.substring(i+1,i+3);
if(parseInt("0x"+asc)>0x7f) {
ret += asc2str(parseInt("0x"+asc+str.substring(i+4,i+6)));//这里用到了VBscript
i += 5;
}else {
ret += asc2str(parseInt("0x"+asc));//这里用到了VBscript
i += 2;
}
}else {
ret+= chr;
}
}
return ret;
}
不过通过这通折腾,对PHP的urlencode的编码算法,却比较了解了一些,自己对JS+VBscript混合版的urldecode改写了一下,竟然成功了,但使用上还有不足,在这里也请各位高手能继续完善一下。
纯JS版的urldecode(抛砖引玉):
首先PHP在用urlencode编码时要转换成utf-8再编码; 复制内容到剪贴板 代码:<?php
$str = "%22%11%23%15%20%21===你好 我的神呀 囧也能出来。,!《》qwertyuiop[]\';lkjhgfdsazxcvbnm,./!@#$%#&*^123456789+_+)_+()_*\"\'(*):l";
$test = iconv("GB2312","UTF-8",$str);
echo $str;
$test_1 = urlencode($test);
?>
然后把PHP编过码的“$test_1”传给JS解码,完美解析。
JS: 复制内容到剪贴板 代码:function URLdecode(str) {
var ret = "";
for(var i=0;i<str.length;i++) {
var chr = str.charAt(i);
if(chr == "+") {
ret += " ";
}else if(chr=="%") {
var asc = str.substring(i+1,i+3);
if(parseInt("0x"+asc)>0x7f) {
ret += decodeURI("%"+ str.substring(i+1,i+9));
i += 8;
}else {
ret += String.fromCharCode(parseInt("0x"+asc));
i += 2;
}
}else {
ret += chr;
}
}
return ret;
}
alert(URLdecode("<?php echo $test_1 ?>"));
两点不足:
1、PHP在urlencode编码时要用utf-8格式,直接用GB2312编码urlencode,再用我写的JS就不能解了,因为里面用了JS的decodeURI,它是对utf-8编码的,所以PHP编的时候也需要用utf-8格式编,不过我觉得应该用更佳的解决方法,比如用JS的escape???
2、在调试时FireBug报过错,但只是报错,却不影响正常使用,之后又不报了。不解之余研究了半天,发现是PHP的编码源里有乱码,乱码类似于“ア”的日、韩文,虽然后来发现该乱码是数据库错误造成的,但还是说明解码不是完全成功的,对极其特殊的一些乱码还是有点问题。但是现在的新新人类们在网上起名时,还都爱加这类希奇古怪的东西,所以不能不考虑...
有那位高人能继续完善一下,并顺便把JS对应PHP的urlencode编码也搞出来,这样JS对PHP的url系列编、解码就都搞定了。
完全支持你,大家都会顶你
static/image/common/sigline.gif
神魔大陆私服 蜀门私服下载 天龙八部私服活力 qq天龙八部私服 秋雨蜀门私服 完美世界 私服 蜀门私服外挂 天龙八部复古私服
今日新开征途私服
页:
[1]