admin 发表于 2011-7-19 01:34:29

用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系列编、解码就都搞定了。

ABC_84 发表于 2011-10-7 01:56:54

完全支持你,大家都会顶你











static/image/common/sigline.gif
神魔大陆私服 蜀门私服下载 天龙八部私服活力 qq天龙八部私服 秋雨蜀门私服 完美世界 私服 蜀门私服外挂 天龙八部复古私服
今日新开征途私服
页: [1]
查看完整版本: 用JS解码PHP的urlencode编码