js 64进制转换方法 & URL参数压缩

经常URL上面需要有不少中文,但直接放置中文容易出现乱码,所以要进行转码,但普通转码后,会发现URL太长了,不便于保存和处理。和朋友讨论以后,觉得可以使用一定的压缩算法,将转码后的中文进行处理,能够明显减少URL的长度,一般能减少50%
 
代码如下:

   //普通2、8、10、16进制自由转换
   function EvalAny(num00, fromRadix, toRadix)
    {
       var num01 = parseInt(num00, fromRadix)
       return num01.toString(toRadix);
    }
    //将某个64以下的数字由10进制转为64进制
   function n10To64(num) {
       if (num < 10) {
           return String.fromCharCode(48 + num);
       } else if (num >= 10 && num <= 35) {
           return String.fromCharCode(55 + num);
       } else if (num >= 36 && num <= 61) {
           return String.fromCharCode(61 + num);
       } else if (num == 62) {
           return "-";
       } else if (num == 63) {
           return "_";
       }
       return "";
    }
    //将某个64以下的数字由64进制转为10进制
   function n64To10(num){
       var j = num.charCodeAt();
       if (num == "_") {
           return 63;
       } else if (num == "-") {
           return 62;
       } else if (j >= 97 && j <= 122) {
           return j - 61;
       } else if (j >= 65 && j <= 90) {
           return j - 55;
       } else if (j >= 48 && j <= 57) {
           return j - 48;
       }
       return "";
    }
    //将16进制数字转换为64进制
   function w16To64(num) {
       var a2 = EvalAny(num, 16, 2);
       while (a2.length < 16) {
           a2 = "0" + a2;
       }
       var b1 = parseInt(EvalAny(a2.substring(0, 4), 2, 10));
       var b2 = parseInt(EvalAny(a2.substring(4, 10), 2, 10));
       var b3 = parseInt(EvalAny(a2.substring(10, 16), 2, 10));
       return n10To64(b1) + n10To64(b2) + n10To64(b3)
    }
    //将64进制数字转换为16进制
   function w64To16(num) {
       var a = 0;
       for (var n = 0; n < num.length; n++) {
           var x = n64To10(num.charAt(n));
           for (var m = 0; m < (num.length - n - 1); m++) {
               x = x * 64;
           }
           a += x;
       }
       var a1 = EvalAny(a, 10, 16);
       while (a1.length < 4) {
           a1 = "0" + a1;
       }
       return a1;
    }
    //汉字、特殊字符等转Unicode编码
   function toUnicode(text)
    {
       text = escape(text.toString()).replace(/\+/g, "%2B");

       var matches = text.match(/(%([0-9A-F]{2}))/gi);
       if (matches)
       {
           for (var matchid = 0; matchid < matches.length; matchid++)
           {
               var code = matches[matchid].substring(1, 3);
               text = text.replace(matches[matchid], '%u00' + code);
           }
       }
       return text;
    }
    //将汉字转Unicode码、16进制转64进制、并实现压缩(主函数)
   function toZipUnicode(text)
    {
       text = toUnicode(text);
       var tmp = "";
       for (var i = 0; i < text.length; i++) {
           if (text.charAt(i) == "%" && text.charAt(i + 1) == "u"){
               tmp += w16To64(text.substring(i + 2, i + 6));
               i += 5
           } else {
               tmp += ("$" + text.charAt(i));
           }
       }
       return tmp;
    }
    //将压缩的参数还原汉字(主函数)
   function unZipUnicode(text)
    {
       var tmp = "";
       for (var i = 0; i < text.length; i++) {
           if (text.charAt(i) == "$") {
               tmp += text.substring(i+1, i+2);
               i++
           } else {
               tmp += "\\u" + w64To16(text.substring(i, i+3));
               i+=2;
           }
       }
       var unTmp = "";
       eval_r("unTmp=\""+tmp+"\"");
       return unTmp;
   }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值