隨筆-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 前方的路 閱讀(1076) 評論(0)  編輯  收藏 所屬分類: Java技術Web 2.0
          主站蜘蛛池模板: 政和县| 舟曲县| 上栗县| 周口市| 秭归县| 荆门市| 蕉岭县| 曲松县| 福泉市| 合江县| 秭归县| 永安市| 鄂托克前旗| 原阳县| 绍兴市| 思茅市| 浏阳市| 广宗县| 高要市| 玛纳斯县| 海丰县| 和平区| 政和县| 临夏市| 奉贤区| 电白县| 黄大仙区| 东港市| 邵东县| 资阳市| 莫力| 页游| 明光市| 永修县| 开封市| 铜鼓县| 安新县| 卓尼县| 叙永县| 镇江市| 房山区|