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

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


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

下面先来看两个函数,UTF16转UTF8和UTF8转Utf16的。
function utf16to8(str) {
    
var out, i, len, c;

    out 
= "";
    len 
= str.length;
    
for(i = 0; i < len; i++{
 c 
= str.charCodeAt(i);
 
if ((c >= 0x0001&& (c <= 0x007F)) {
     out 
+= str.charAt(i);
 }
 else if (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));
 }

    }

    
return out;
}


function utf8to16(str) {
    
var out, i, len, c;
    
var char2, char3;

    out 
= "";
    len 
= str.length;
    i 
= 0;
    
while(i < len) {
 c 
= str.charCodeAt(i++);
 
switch(c >> 4)
 
{
   
case 0case 1case 2case 3case 4case 5case 6case 7:
     
// 0xxxxxxx
     out += str.charAt(i-1);
     
break;
   
case 12case 13:
     
// 110x xxxx   10xx xxxx
     char2 = str.charCodeAt(i++);
     out 
+= String.fromCharCode(((c & 0x1F<< 6| (char2 & 0x3F));
     
break;
   
case 14:
     
// 1110 xxxx  10xx xxxx  10xx xxxx
     char2 = str.charCodeAt(i++);
     char3 
= str.charCodeAt(i++);
     out 
+= String.fromCharCode(((c & 0x0F<< 12|
        ((char2 
& 0x3F<< 6|
        ((char3 
& 0x3F<< 0));
     
break;
 }

    }


    
return out;
}
那么为什么需要进行转化呢?因为在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加码和解码的相关类:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

namespace CNVP.Base64
{
    
/// <summary>
    
/// MyBase64 的摘要说明
    
/// </summary>

    public class MyBase64
    
{
        
public MyBase64()
        
{
            
//
            
// TODO: 在此处添加构造函数逻辑
            
//
        }

        
/// <summary>
        
/// 服务器端Base64编码
        
/// </summary>
        
/// <param name="data"></param>
        
/// <returns></returns>

        public string base64Encode(string data)
        
{
            
try
            
{
                
byte[] encData_byte = new byte[data.Length];
                encData_byte 
= System.Text.Encoding.UTF8.GetBytes(data);
                
string encodedData = Convert.ToBase64String(encData_byte);
                
return encodedData;
            }

            
catch (Exception e)
            
{
                
throw new Exception("Error in base64Encode" + e.Message);
            }

        }

        
/// <summary>
        
/// 服务器端Base64解码
        
/// </summary>
        
/// <param name="data"></param>
        
/// <returns></returns>

        public string base64Decode(string data)
        
{
            
try
            
{
                System.Text.UTF8Encoding encoder 
= new System.Text.UTF8Encoding();
                System.Text.Decoder utf8Decode 
= encoder.GetDecoder();
                
byte[] todecode_byte = Convert.FromBase64String(data);
                
int charCount = utf8Decode.GetCharCount(todecode_byte, 0, todecode_byte.Length);
                
char[] decoded_char = new char[charCount];
                utf8Decode.GetChars(todecode_byte, 
0, todecode_byte.Length, decoded_char, 0);
                
string result = new String(decoded_char);
                
return result;
            }

            
catch (Exception e)
            
{
                
throw new Exception("Error in base64Decode" + e.Message);
            }

        }

    }

}

        var Keyword=base64encode(utf16to8(document.all.Keyword.value));
        Keyword
=Keyword.replace("+","%2B");//替换+,否则在服务器解码的时候会出错
服务器端使用以下代码调用:
CNVP.Base64.MyBase64 base64 = new CNVP.Base64.MyBase64();
            Keyword
=base64.base64Decode(Keyword);
http://www.cnblogs.com/kylinindotnet/archive/2007/06/28/798893.html
posted on 2007-06-29 14:38  刺猬博客  阅读(1120)  评论(1编辑  收藏  举报