设为首页收藏本站

就爱编程论坛

 找回密码
 注册

人人连接登陆

无需注册,直接登录

用新浪微博连接

一步搞定

QQ登录

只需一步,快速开始

查看: 1432|回复: 1
打印 上一主题 下一主题

用JS解码PHP的urlencode编码 [复制链接]

Rank: 9Rank: 9Rank: 9

  • TA的每日心情
    无聊
    2025-5-27 03:37:20
  • 签到天数: 366 天

    [LV.9]以坛为家II

    论坛先锋 学习至圣 荣誉成员 论坛元老 活跃之星 终极领袖

    我玩的应用:

    跳转到指定楼层
    楼主
    发表于 2011-7-19 01:34:29 |只看该作者 |倒序浏览
    做项目,需要用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系列编、解码就都搞定了。
    分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    分享分享0 收藏收藏0 支持支持0 反对反对0 分享到人人 转发到微博
    [img=http://mail.qq.com/cgi-bin/qm_share?t=qm_mailme&email=fRUcHhYWGAQ9GxIFEBwUEVMeEhA]http://rescdn.qqmail.com/zh_CN/htmledition/images/function/qm_open/ico_mailme_02.png[/img]

    使用道具 举报

    Rank: 3Rank: 3

    升级 
     
    46.33%

    该用户从未签到

    沙发
    发表于 2011-10-7 01:56:54 |只看该作者

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册 人人连接登陆

    晴云孤魂's Blog|就爱编程搜帖|手机版|Archiver|就爱编程论坛     

    GMT+8, 2025-7-4 23:30 , Processed in 0.109887 second(s), 30 queries .

    Powered by Discuz! X2

    © 2001-2011 Comsenz Inc.

    回顶部