<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-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 前方的路 閱讀(1075) 評論(0)  編輯  收藏 所屬分類: Java技術 、Web 2.0
    主站蜘蛛池模板: 国产92成人精品视频免费| 久久精品亚洲福利| 四虎永久成人免费| A国产一区二区免费入口| 亚洲黄色片免费看| xxxxwww免费| 另类图片亚洲校园小说区| 亚洲av无码潮喷在线观看| 免费无遮挡无码视频网站| 黄色免费在线网站| 亚洲男人的天堂网站| 在线观看永久免费视频网站| a级毛片毛片免费观看永久| 亚洲第一永久在线观看| 国内精自视频品线六区免费| 国产成人亚洲合集青青草原精品 | 精品免费tv久久久久久久| 亚洲国产美女精品久久| 国产精品V亚洲精品V日韩精品| 91在线视频免费播放| 成人毛片100免费观看| 亚洲av无码无线在线观看| 国产视频精品免费| 222www免费视频| 韩国免费a级作爱片无码| 亚洲久热无码av中文字幕| 久久青青草原亚洲av无码app| 亚洲国产综合人成综合网站| 成人片黄网站A毛片免费| 性无码免费一区二区三区在线 | jyzzjyzz国产免费观看| 亚洲av永久无码天堂网| 亚洲视频一区二区在线观看| 国产亚洲视频在线播放| 国产美女无遮挡免费视频| 久久电影网午夜鲁丝片免费| 午夜免费福利视频| 香蕉免费看一区二区三区| 特黄特色大片免费| 香蕉视频在线观看免费| 国产亚洲欧美在线观看|