配色: 字号:
JavaScript Base64编码和解码,实现URL参数传递
2016-10-25 | 阅:  转:  |  分享 
  
JavaScriptBase64编码和解码,实现URL参数传递

为什么需要对参数进行编码?相信有过开发的经验的广大程序员都知道,在Web中,若是直接在Url地址上传递参数值,若是中文,或者+等什么的就会出现乱码现象,若是数字或者英文的好象没有什么问题,简言之,传递过来的参数是需要进行编码的。

在这里,也许有人会说,为什么不直接用Server.UrlDecode和Server.UrlEncode这两个来进行编码和解码的操作呢?



的确,这两个服务器端对象很好使用,用起来也很方便,但是,若在客户端是HTML的Input,查询的时候页面是HTML或者其他的,反正不是.NET的,那这个对象还可以用吗?





我现在就遇到这样的问题,查询的东东放在页面,而且那个页面我根本不想让他是.aspx结尾的,哈,感觉HTML的挺不错,而且里面的控件也是用HTML对象的。



下面先来看两个函数,UTF16转UTF8和UTF8转Utf16的。

functionutf16to8(str){

varout,i,len,c;



out="";

len=str.length;

for(i=0;i
c=str.charCodeAt(i);

if((c>=0x0001)&&(c<=0x007F)){

out+=str.charAt(i);

}elseif(c>0x07FF){

out+=String.fromCharCode(0xE0|((c>>12)&0x0F));

out+=String.fromCharCode(0x80|((c>>6)&0x3F));

out+=String.fromCharCode(0x80|((c>>0)&0x3F));

}else{

out+=String.fromCharCode(0xC0|((c>>6)&0x1F));

out+=String.fromCharCode(0x80|((c>>0)&0x3F));

}

}

returnout;

}



functionutf8to16(str){

varout,i,len,c;

varchar2,char3;



out="";

len=str.length;

i=0;

while(i
c=str.charCodeAt(i++);

switch(c>>4)

{

case0:case1:case2:case3:case4:case5:case6:case7:

//0xxxxxxx

out+=str.charAt(i-1);

break;

case12:case13:

//110xxxxx10xxxxxx

char2=str.charCodeAt(i++);

out+=String.fromCharCode(((c&0x1F)<<6)|(char2&0x3F));

break;

case14:

//1110xxxx10xxxxxx10xxxxxx

char2=str.charCodeAt(i++);

char3=str.charCodeAt(i++);

out+=String.fromCharCode(((c&0x0F)<<12)|

((char2&0x3F)<<6)|

((char3&0x3F)<<0));

break;

}

}



returnout;

}



那么为什么需要进行转化呢?因为在JavaScript中获得的中文字符是用UTF16进行编码的,和我们统一的页面标准格式UTF-8可不一样哦,所以需要先进行转化,上面的函数UTF-16到UTF8,然后再进行Base64的编码。



下面是关于Js进行Base64编码和解码的相关操作:



varbase64EncodeChars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

varbase64DecodeChars=newArray(

-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,

-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,

-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63,

52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1,

-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,

15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,

-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,

41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1);

//客户端Base64编码

functionbase64encode(str){

varout,i,len;

varc1,c2,c3;



len=str.length;

i=0;

out="";

while(i
c1=str.charCodeAt(i++)&0xff;

if(i==len)

{

out+=base64EncodeChars.charAt(c1>>2);

out+=base64EncodeChars.charAt((c1&0x3)<<4);

out+="==";

break;

}

c2=str.charCodeAt(i++);

if(i==len)

{

out+=base64EncodeChars.charAt(c1>>2);

out+=base64EncodeChars.charAt(((c1&0x3)<<4)|((c2&0xF0)>>4));

out+=base64EncodeChars.charAt((c2&0xF)<<2);

out+="=";

break;

}

c3=str.charCodeAt(i++);

out+=base64EncodeChars.charAt(c1>>2);

out+=base64EncodeChars.charAt(((c1&0x3)<<4)|((c2&0xF0)>>4));

out+=base64EncodeChars.charAt(((c2&0xF)<<2)|((c3&0xC0)>>6));

out+=base64EncodeChars.charAt(c3&0x3F);

}

returnout;

}

//客户端Base64解码

functionbase64decode(str){

varc1,c2,c3,c4;

vari,len,out;



len=str.length;

i=0;

out="";

while(i
/c1/

do{

c1=base64DecodeChars[str.charCodeAt(i++)&0xff];

}while(i
if(c1==-1)

break;



/c2/

do{

c2=base64DecodeChars[str.charCodeAt(i++)&0xff];

}while(i
if(c2==-1)

break;



out+=String.fromCharCode((c1<<2)|((c2&0x30)>>4));



/c3/

do{

c3=str.charCodeAt(i++)&0xff;

if(c3==61)

returnout;

c3=base64DecodeChars[c3];

}while(i
if(c3==-1)

break;



out+=String.fromwww.hunanwang.net.CharCode(((c2&0XF)<<4)|((c3&0x3C)>>2));



/c4/

do{

c4=str.charCodeAt(i++)&0xff;

if(c4==61)

returnout;

c4=base64DecodeChars[c4];

}while(i
if(c4==-1)

break;

out+=String.fromCharCode(((c3&0x03)<<6)|c4);

}

returnout;

}



这样传递过去的值就可以在服务器端解码操作了。

下面是C#的Base64加码和解码的相关类:

usingSystem;

usingSystem.Data;

usingSystem.Configuration;

usingSystem.Web;

usingSystem.Web.Security;

usingSystem.Web.UI;

usingSystem.Web.UI.WebControls;

usingSystem.Web.UI.WebControls.WebParts;

usingSystem.Web.UI.HtmlControls;



namespaceCNVP.Base64

{

///

///MyBase64的摘要说明

///


publicclassMyBase64

{

publicMyBase64()

{

//

//TODO:在此处添加构造函数逻辑

//

}

///

///服务器端Base64编码

///


///

///

publicstringbase64Encode(stringdata)

{

try

{

byte[]encData_byte=newbyte[data.Length];

encData_byte=System.Text.Encoding.UTF8.GetBytes(data);

stringencodedData=Convert.ToBase64String(encData_byte);

returnencodedData;

}

catch(Exceptione)

{

thrownewException("Errorinbase64Encode"+e.Message);

}

}

///

///服务器端Base64解码

///


///

///

publicstringbase64Decode(stringdata)

{

try

{

System.Text.UTF8Encodingencoder=newSystem.Text.UTF8Encoding();

System.Text.Decoderutf8Decode=encoder.GetDecoder(www.visa158.com);

byte[]todecode_byte=Convert.FromBase64String(data);

intcharCount=utf8Decode.GetCharCount(todecode_byte,0,todecode_byte.Length);

char[]decoded_char=newchar[charCount];

utf8Decode.GetChars(todecode_byte,0,todecode_byte.Length,decoded_char,0);

stringresult=newString(decoded_char);

returnresult;

}

catch(Exceptione)

{

thrownewException("Errorinbase64Decode"+e.Message);

}

}

}

}



varKeyword=base64encode(utf16to8(document.all.Keyword.value));

Keyword=Keyword.replace("+","%2B");//替换+,否则在服务器解码的时候会出错

服务器端使用以下代码调用:

CNVP.Base64.MyBase64base64=newCNVP.Base64.MyBase64();

Keyword=base64.base64Decode(Keyword);





















献花(0)
+1
(本文系白狐一梦首藏)