编码与解码

在javascript中我们用escape方法对某个字符串进行编码,escape 方法返回一个包含 charstring 内容的字符串值(Unicode 格式)。所有空格、标点、重音符号以及任何其他非 ASCII 字符都用 %xx 编码替换,其中 xx 等于表示该字符的十六进制数。例如,空格返回为“%20”。字符值大于 255 的字符以 %uxxxx 格式存储。也就是escape方法会把字符转换为Unicode字符集中所对应的码值.在网页中为了防止乱码,会用escape编码后传送参数,在接收参数的页对参数进行解码后再应用.示例代码:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>新建网页 1</title>
<script>
 var c1="TradeGen.aspx?id=" +  escape("你是一个小兵");
 //var c1="你是一个小兵";
 //document.write(escape(c1));
 //document.write(unescape(escape(c1)));
 window.open(c1,'_salf');
</script>
</head>
<body>
</body>
</html>
这一页是用javascript把参数id传到TradeGen.aspx页,在TradeGen.aspx中,我们这样解码:
Page.Response.Write(System.Web.HttpUtility.UrlDecode(Page.Request.QueryString["id"]))
就可以得到传过来的中文参数.
escape("我是一个小兵");得到结果是%u6211%u662F%u4E00%u4E2A%u5C0F%u5175.
在.net中HttpUtility类专门用来处理web 请求中的编码和解码工作.它有UrlDecode(解码)和UrlEncode(编码)方法,都有一个参数Encoding,用来指定按那种字符集来解码或编码.
在网页(http)中的编码和解码方式与在二进制(byte)中的编码和解码不一样,在.net的System.Text命名空间下,有Decoder类和Encoder类负责对二进制串的解码和解码以及,二字制类型(byte类型)与字符串类型(string类型)的相互转换.在System.Text命名空间下还有ASCIIEncoding类,UTF8Encoding类,UTF7Encoding类和UnicodeEncoding类,这些类都继承自Encoding类,专门用于处理各种字符串的编码和解码工作.基核心类是Encoding类.
先来看看在html和在二进制(byte)中编码和解码的不同之处,同样是一个"你"字,在javascript中有escape编码得到的字符串是"%u4F60",在.net是用Unicode进行编码得到是"96,79",其实本质是没有不同,"96,79"其实是十六进制值"4F60"的十进制值表示而已,但在html编码中加了前缀"%u",在byte编码中没有加这个前缀.差别就在这,所以解码方式也不一样.所以就有了单独的html编码和解码类.因为在html编码和解码中要处理前缀"%"或"%u".
下面来看看不同的字符集的解码和编码,新建一个aspx页面,在Page_Load事件中写:
private void Page_Load(object sender, System.EventArgs e)
 {
 
 //Unicode编码(UTF-16,系统的默认编码方式)
 
 System.Text.UnicodeEncoding ue=new UnicodeEncoding();
  
   
    
 byte[] b=ue.GetBytes("你");
 foreach(byte b1 in b)
 {
  Page.Response.Write(b1.ToString() + ",");
 }
  
   
    
 char[] ch=new char[b.Length];
 ue.GetChars(b,0,b.Length,ch,0);
 foreach(char ch1 in ch)
 {
  Page.Response.Write(ch1.ToString());
 }
 Page.Response.Write("<br>");
 //gb2312编码
 System.Text.Encoding ed=System.Text.Encoding.GetEncoding("gb2312");
 byte[] b2=ed.GetBytes("你");
  
   
    
 foreach(byte b3 in b2)
 {
  Page.Response.Write(b3.ToString() + ",");
 }
 System.Text.Decoder dr=ed.GetDecoder();
 char[] ch2=new char[b2.Length];
 dr.GetChars(b2,0,b2.Length,ch2,0);
 foreach(char ch3 in ch2)
 {
  Page.Response.Write(ch3.ToString());
 }
 //从byte转成字符串
 byte[] bt={196,227};
  
   
    
 Page.Response.Write("<br>" + ed.GetString(bt,0,bt.Length));
 
 }
从示例中可以看出unicode编码与gb2312编码对同一个字进行编码和解码的结果都是不同的.你字在gb2312中编码结果是"196,227",Unicode进行编码得到是"96,79".
二进制的编码和解码在把文件存到数据库和输出到客户端显示时很重要,用错编码的话,到了数据库或客户端就会产生乱码,而文件的读和写又与流相关.所以.net中的流的定义就有Encoding有关了.System.IO.StreamReader和System.IO.StreamWriter都有一个指定字符集的构造函数,用于读或写二进制数据,读的话是从二进制(byte)转换指定字符集字符串(解码过程),写的话是从指定字符集字符串转换成二进制(编码过程).示例代码,把一个字符串用"gb2312"编码方式写到指定的文件路径中:
/// <summary>
 /// 替换img标签的src属性
 /// </summary>
 /// <param name="source">源字符串</param>
 /// <param name="filepath_name">保存的文件名和路径(相对于应用程序的根路径)</param>
 public bool UploadHtmlFile(string source,string filepath_name)
 {
  Try
  {
   //然后把string当成一个文件写入到服务器中
   
    
   filepath_name =System.Web.HttpContext.Current.Request.PhysicalApplicationPath + filepath_name;
   FileStream fs_file=new FileStream(filepath_name,FileMode.Create,FileAccess.Write);
   StreamWriter bw_file=new StreamWriter(fs_file,System.Text.Encoding.GetEncoding("gb2312"));
   
    
   bw_file.Write(source);
   bw_file.Flush();
   bw_file.Close();
   fs_file.Close();
   Return true;
  }
  catch
  {
   return false;
  }
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值