随笔-72  评论-20  文章-0  trackbacks-1

为什么需要对参数进行编码?相信有过开发的经验的广大程序员都知道,在Web中,若是直接在Url地址上传递参数值,若是中文,或者+等什么的就会出现乱码现象,若是数字或者英文的好象没有什么问题,简言之,传递过来的参数是需要进行编码的。
在这里,也许有人会说,为什么不直接用Server.UrlDecode和Server.UrlEncode这两个来进行编码和解码的操作呢?

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


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

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

 1 function utf16to8(str) {
 2     var out, i, len, c;
 3 
 4     out = "";
 5     len = str.length;
 6     for(i = 0; i < len; i++) {
 7  c = str.charCodeAt(i);
 8  if ((c >= 0x0001&& (c <= 0x007F)) {
 9      out += str.charAt(i);
10  } else if (c > 0x07FF) {
11      out += String.fromCharCode(0xE0 | ((c >> 12& 0x0F));
12      out += String.fromCharCode(0x80 | ((c >>  6& 0x3F));
13      out += String.fromCharCode(0x80 | ((c >>  0& 0x3F));
14  } else {
15      out += String.fromCharCode(0xC0 | ((c >>  6& 0x1F));
16      out += String.fromCharCode(0x80 | ((c >>  0& 0x3F));
17  }
18     }
19     return out;
20 }
21 
22 function utf8to16(str) {
23     var out, i, len, c;
24     var char2, char3;
25 
26     out = "";
27     len = str.length;
28     i = 0;
29     while(i < len) {
30  c = str.charCodeAt(i++);
31  switch(c >> 4)
32  { 
33    case 0case 1case 2case 3case 4case 5case 6case 7:
34      // 0xxxxxxx
35      out += str.charAt(i-1);
36      break;
37    case 12case 13:
38      // 110x xxxx   10xx xxxx
39      char2 = str.charCodeAt(i++);
40      out += String.fromCharCode(((c & 0x1F<< 6| (char2 & 0x3F));
41      break;
42    case 14:
43      // 1110 xxxx  10xx xxxx  10xx xxxx
44      char2 = str.charCodeAt(i++);
45      char3 = str.charCodeAt(i++);
46      out += String.fromCharCode(((c & 0x0F<< 12|
47         ((char2 & 0x3F<< 6|
48         ((char3 & 0x3F<< 0));
49      break;
50  }
51     }
52 
53     return out;
54 }


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

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

var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
var base64DecodeChars = new Array(
    
-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-162-1-1-163,
    
52535455565758596061-1-1-1-1-1-1,
    
-1,  0,  1,  2,  3,  4,  5,  6,  7,  8,  91011121314,
    
1516171819202122232425-1-1-1-1-1,
    
-1262728293031323334353637383940,
    
4142434445464748495051-1-1-1-1-1);
//客户端Base64编码
function base64encode(str) {
    
var out, i, len;
    
var c1, c2, c3;
    len 
= str.length;
    i 
= 0;

    out 
= "";
    
while(i < len) {
 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);
    }
    
return out;
}
//客户端Base64解码
function base64decode(str) {
    
var c1, c2, c3, c4;
    
var i, len, out;

    len 
= str.length;
    i 
= 0;
    out 
= "";
    
while(i < len) {
 
/* c1 */
 
do {
     c1 
= base64DecodeChars[str.charCodeAt(i++& 0xff];
 } 
while(i < len && c1 == -1);
 
if(c1 == -1)
     
break;

 
/* c2 */
 
do {
     c2 
= base64DecodeChars[str.charCodeAt(i++& 0xff];
 } 
while(i < len && c2 == -1);
 
if(c2 == -1)
     
break;

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

 
/* c3 */
 
do {
     c3 
= str.charCodeAt(i++& 0xff;
     
if(c3 == 61)
  
return out;
     c3 
= base64DecodeChars[c3];
 } 
while(i < len && c3 == -1);
 
if(c3 == -1)
     
break;

 out 
+= String.fromCharCode(((c2 & 0XF<< 4| ((c3 & 0x3C>> 2));

 
/* c4 */
 
do {
     c4 
= str.charCodeAt(i++& 0xff;
     
if(c4 == 61)
  
return out;
     c4 
= base64DecodeChars[c4];
 } 
while(i < len && c4 == -1);
 
if(c4 == -1)
     
break;
 out 
+= String.fromCharCode(((c3 & 0x03<< 6| c4);
    }
    
return out;
}
这样传递过去的值就可以在服务器端解码操作了。
下面是C#的Base64加码和解码的相关类:

 1 using System;
 2 using System.Data;
 3 using System.Configuration;
 4 using System.Web;
 5 using System.Web.Security;
 6 using System.Web.UI;
 7 using System.Web.UI.WebControls;
 8 using System.Web.UI.WebControls.WebParts;
 9 using System.Web.UI.HtmlControls;
10 
11 namespace CNVP.Base64
12 {
13     /// <summary>
14     /// MyBase64 的摘要说明
15     /// </summary>
16     public class MyBase64
17     {
18         public MyBase64()
19         {
20             //
21             // TODO: 在此处添加构造函数逻辑
22             //
23         }
24         /// <summary>
25         /// 服务器端Base64编码
26         /// </summary>
27         /// <param name="data"></param>
28         /// <returns></returns>
29         public string base64Encode(string data)
30         {
31             try
32             {
33                 byte[] encData_byte = new byte[data.Length];
34                 encData_byte = System.Text.Encoding.UTF8.GetBytes(data);
35                 string encodedData = Convert.ToBase64String(encData_byte);
36                 return encodedData;
37             }
38             catch (Exception e)
39             {
40                 throw new Exception("Error in base64Encode" + e.Message);
41             }
42         }
43         /// <summary>
44         /// 服务器端Base64解码
45         /// </summary>
46         /// <param name="data"></param>
47         /// <returns></returns>
48         public string base64Decode(string data)
49         {
50             try
51             {
52                 System.Text.UTF8Encoding encoder = new System.Text.UTF8Encoding();
53                 System.Text.Decoder utf8Decode = encoder.GetDecoder();
54                 byte[] todecode_byte = Convert.FromBase64String(data);
55                 int charCount = utf8Decode.GetCharCount(todecode_byte, 0, todecode_byte.Length);
56                 char[] decoded_char = new char[charCount];
57                 utf8Decode.GetChars(todecode_byte, 0, todecode_byte.Length, decoded_char, 0);
58                 string result = new String(decoded_char);
59                 return result;
60             }
61             catch (Exception e)
62             {
63                 throw new Exception("Error in base64Decode" + e.Message);
64             }
65         }
66     }
67 }
        var Keyword=base64encode(utf16to8(document.all.Keyword.value));
        Keyword=Keyword.replace("+","%2B");//替换+,否则在服务器解码的时候会出错

服务器端使用以下代码调用:
            CNVP.Base64.MyBase64 base64 = new CNVP.Base64.MyBase64();
            Keyword=base64.base64Decode(Keyword);

posted on 2009-06-16 10:34 前方的路 阅读(1060) 评论(0)  编辑  收藏 所属分类: Java技术Web 2.0

只有注册用户登录后才能发表评论。


网站导航: