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

本文详细介绍了在Web开发中为何需要对URL参数进行编码,并提供了JavaScript和C#实现的编码及解码方法。针对中文参数易导致乱码的问题,文章给出了从UTF-16到UTF-8的转换方案,并进一步采用Base64编码确保参数正确传递。
为什么需要对参数进行编码?相信有过开发的经验的广大程序员都知道,在Web中,若是直接在Url地址上传递参数值,若是中文,或者+等什么的就会出现乱码现象,若是数字或者英文的好象没有什么问题,简言之,传递过来的参数是需要进行编码的。
在这里,也许有人会说,为什么不直接用Server.UrlDecode和Server.UrlEncode这两个来进行编码和解码的操作呢?

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


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

下面先来看两个函数,UTF16转UTF8和UTF8转Utf16的。
ExpandedBlockStart.gif ContractedBlock.gif function  utf16to8(str)  dot.gif {
InBlock.gif    
var out, i, len, c;
InBlock.gif
InBlock.gif    out 
= "";
InBlock.gif    len 
= str.length;
ExpandedSubBlockStart.gifContractedSubBlock.gif    
for(i = 0; i < len; i++dot.gif{
InBlock.gif c 
= str.charCodeAt(i);
ExpandedSubBlockStart.gifContractedSubBlock.gif 
if ((c >= 0x0001&& (c <= 0x007F)) dot.gif{
InBlock.gif     out 
+= str.charAt(i);
ExpandedSubBlockStart.gifContractedSubBlock.gif }
 else if (c > 0x07FFdot.gif{
InBlock.gif     out 
+= String.fromCharCode(0xE0 | ((c >> 12& 0x0F));
InBlock.gif     out 
+= String.fromCharCode(0x80 | ((c >>  6& 0x3F));
InBlock.gif     out 
+= String.fromCharCode(0x80 | ((c >>  0& 0x3F));
ExpandedSubBlockStart.gifContractedSubBlock.gif }
 else dot.gif{
InBlock.gif     out 
+= String.fromCharCode(0xC0 | ((c >>  6& 0x1F));
InBlock.gif     out 
+= String.fromCharCode(0x80 | ((c >>  0& 0x3F));
ExpandedSubBlockEnd.gif }

ExpandedSubBlockEnd.gif    }

InBlock.gif    
return out;
ExpandedBlockEnd.gif}

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

ExpandedSubBlockEnd.gif    }

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

下面是关于Js进行Base64编码和解码的相关操作:
None.gif var  base64EncodeChars  =   " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ " ;
None.gif
var  base64DecodeChars  =   new  Array(
None.gif    
- 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 ,
None.gif    
- 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 ,
None.gif    
- 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 62 - 1 - 1 - 1 63 ,
None.gif    
52 53 54 55 56 57 58 59 60 61 - 1 - 1 - 1 - 1 - 1 - 1 ,
None.gif    
- 1 ,   0 ,   1 ,   2 ,   3 ,   4 ,   5 ,   6 ,   7 ,   8 ,   9 10 11 12 13 14 ,
None.gif    
15 16 17 18 19 20 21 22 23 24 25 - 1 - 1 - 1 - 1 - 1 ,
None.gif    
- 1 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 ,
None.gif    
41 42 43 44 45 46 47 48 49 50 51 - 1 - 1 - 1 - 1 - 1 );
None.gif
// 客户端Base64编码
ExpandedBlockStart.gifContractedBlock.gif
function  base64encode(str)  dot.gif {
InBlock.gif    
var out, i, len;
InBlock.gif    
var c1, c2, c3;
InBlock.gif
InBlock.gif    len 
= str.length;
InBlock.gif    i 
= 0;
InBlock.gif    out 
= "";
ExpandedSubBlockStart.gifContractedSubBlock.gif    
while(i < len) dot.gif{
InBlock.gif c1 
= str.charCodeAt(i++& 0xff;
InBlock.gif 
if(i == len)
ExpandedSubBlockStart.gifContractedSubBlock.gif 
dot.gif{
InBlock.gif     out 
+= base64EncodeChars.charAt(c1 >> 2);
InBlock.gif     out 
+= base64EncodeChars.charAt((c1 & 0x3<< 4);
InBlock.gif     out 
+= "==";
InBlock.gif     
break;
ExpandedSubBlockEnd.gif }

InBlock.gif c2 
= str.charCodeAt(i++);
InBlock.gif 
if(i == len)
ExpandedSubBlockStart.gifContractedSubBlock.gif 
dot.gif{
InBlock.gif     out 
+= base64EncodeChars.charAt(c1 >> 2);
InBlock.gif     out 
+= base64EncodeChars.charAt(((c1 & 0x3)<< 4| ((c2 & 0xF0>> 4));
InBlock.gif     out 
+= base64EncodeChars.charAt((c2 & 0xF<< 2);
InBlock.gif     out 
+= "=";
InBlock.gif     
break;
ExpandedSubBlockEnd.gif }

InBlock.gif c3 
= str.charCodeAt(i++);
InBlock.gif out 
+= base64EncodeChars.charAt(c1 >> 2);
InBlock.gif out 
+= base64EncodeChars.charAt(((c1 & 0x3)<< 4| ((c2 & 0xF0>> 4));
InBlock.gif out 
+= base64EncodeChars.charAt(((c2 & 0xF<< 2| ((c3 & 0xC0>>6));
InBlock.gif out 
+= base64EncodeChars.charAt(c3 & 0x3F);
ExpandedSubBlockEnd.gif    }

InBlock.gif    
return out;
ExpandedBlockEnd.gif}

None.gif
// 客户端Base64解码
ExpandedBlockStart.gifContractedBlock.gif
function  base64decode(str)  dot.gif {
InBlock.gif    
var c1, c2, c3, c4;
InBlock.gif    
var i, len, out;
InBlock.gif
InBlock.gif    len 
= str.length;
InBlock.gif    i 
= 0;
InBlock.gif    out 
= "";
ExpandedSubBlockStart.gifContractedSubBlock.gif    
while(i < len) dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif 
/**//* c1 */
ExpandedSubBlockStart.gifContractedSubBlock.gif 
do dot.gif{
InBlock.gif     c1 
= base64DecodeChars[str.charCodeAt(i++& 0xff];
ExpandedSubBlockEnd.gif }
 while(i < len && c1 == -1);
InBlock.gif 
if(c1 == -1)
InBlock.gif     
break;
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif 
/**//* c2 */
ExpandedSubBlockStart.gifContractedSubBlock.gif 
do dot.gif{
InBlock.gif     c2 
= base64DecodeChars[str.charCodeAt(i++& 0xff];
ExpandedSubBlockEnd.gif }
 while(i < len && c2 == -1);
InBlock.gif 
if(c2 == -1)
InBlock.gif     
break;
InBlock.gif
InBlock.gif out 
+= String.fromCharCode((c1 << 2| ((c2 & 0x30>> 4));
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif 
/**//* c3 */
ExpandedSubBlockStart.gifContractedSubBlock.gif 
do dot.gif{
InBlock.gif     c3 
= str.charCodeAt(i++& 0xff;
InBlock.gif     
if(c3 == 61)
InBlock.gif  
return out;
InBlock.gif     c3 
= base64DecodeChars[c3];
ExpandedSubBlockEnd.gif }
 while(i < len && c3 == -1);
InBlock.gif 
if(c3 == -1)
InBlock.gif     
break;
InBlock.gif
InBlock.gif out 
+= String.fromCharCode(((c2 & 0XF<< 4| ((c3 & 0x3C>> 2));
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif 
/**//* c4 */
ExpandedSubBlockStart.gifContractedSubBlock.gif 
do dot.gif{
InBlock.gif     c4 
= str.charCodeAt(i++& 0xff;
InBlock.gif     
if(c4 == 61)
InBlock.gif  
return out;
InBlock.gif     c4 
= base64DecodeChars[c4];
ExpandedSubBlockEnd.gif }
 while(i < len && c4 == -1);
InBlock.gif 
if(c4 == -1)
InBlock.gif     
break;
InBlock.gif out 
+= String.fromCharCode(((c3 & 0x03<< 6| c4);
ExpandedSubBlockEnd.gif    }

InBlock.gif    
return out;
ExpandedBlockEnd.gif}

None.gif
这样传递过去的值就可以在服务器端解码操作了。
下面是C#的Base64加码和解码的相关类:
None.gif using  System;
None.gif
using  System.Data;
None.gif
using  System.Configuration;
None.gif
using  System.Web;
None.gif
using  System.Web.Security;
None.gif
using  System.Web.UI;
None.gif
using  System.Web.UI.WebControls;
None.gif
using  System.Web.UI.WebControls.WebParts;
None.gif
using  System.Web.UI.HtmlControls;
None.gif
None.gif
namespace  CNVP.Base64
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
ExpandedSubBlockStart.gifContractedSubBlock.gif    
/**//// <summary>
InBlock.gif    
/// MyBase64 的摘要说明
ExpandedSubBlockEnd.gif    
/// </summary>

InBlock.gif    public class MyBase64
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
public MyBase64()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
//
InBlock.gif            
// TODO: 在此处添加构造函数逻辑
InBlock.gif            
//
ExpandedSubBlockEnd.gif
        }

ExpandedSubBlockStart.gifContractedSubBlock.gif        
/**//// <summary>
InBlock.gif        
/// 服务器端Base64编码
InBlock.gif        
/// </summary>
InBlock.gif        
/// <param name="data"></param>
ExpandedSubBlockEnd.gif        
/// <returns></returns>

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

InBlock.gif            
catch (Exception e)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
throw new Exception("Error in base64Encode" + e.Message);
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

ExpandedSubBlockStart.gifContractedSubBlock.gif        
/**//// <summary>
InBlock.gif        
/// 服务器端Base64解码
InBlock.gif        
/// </summary>
InBlock.gif        
/// <param name="data"></param>
ExpandedSubBlockEnd.gif        
/// <returns></returns>

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

InBlock.gif            
catch (Exception e)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
throw new Exception("Error in base64Decode" + e.Message);
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif
None.gif          var  Keyword = base64encode(utf16to8(document.all.Keyword.value));
None.gif        Keyword
= Keyword.replace( " + " , " %2B " ); // 替换+,否则在服务器解码的时候会出错
服务器端使用以下代码调用:
None.gif CNVP.Base64.MyBase64 base64  =   new  CNVP.Base64.MyBase64();
None.gif            Keyword
= base64.base64Decode(Keyword);
http://www.cnblogs.com/kylinindotnet/archive/2007/06/28/798893.html

转载于:https://www.cnblogs.com/jianphu/archive/2007/06/29/800204.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值