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);
|
|