javascript BASE64-客户端(js)加码-服务器端(c#)解码,URL传递“汉字参数”解决方法

为什么需要对参数进行编码?相信有过开发的经验的广大程序员都知道,在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 - 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编码
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/KevinYang/archive/2010/06/18/1760597.html

http://www.cnblogs.com/xiang/archive/2006/07/18/453918.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值