经常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;
}