c# 编码那么事

来源:互联网 发布:淘宝买东西后怎么评价 编辑:程序博客网 时间:2024/06/08 12:14

转载连接: http://blog.csdn.net/heyangyi_19940703/article/details/51219893


在开发过程中,往往会遇到很多关于字符串编码的一些问题。

如说乱码呀,在url跳转过程中参数传递不正确,加密的字符串在请求时服务端介绍解码处理异常。

经过RSA签名的数据在请求后服务端接收后,解码处理异常等等的问题。这些都是与我们的字符串编码有问题的。

先归纳一下知识点:

1.字符:

字符是指计算机中使用的字母、数字、字和符号,包括:1、2、3、A、B、C、~!·#¥%……—*()——+等

2.字符集:

是一个系统支持的所有抽象字符的集合,字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。

3.字符编码:

字符编码(Character Encoding):简单的说就是建立自然语言与机器语言之间的对应关系。

计算机中的信息包括数据信息和控制信息,数据信息又可分为数值和非数值信息。非数值信息和控制信息包括了字母、各种控制符号、图形符号等,它们都以二进制编码方式存入计算机并得以处理,这种对字母和符号进行编码的二进制代码称为字符代码(Character Code)。计算机中常用的字符编码有ASCII码(美国标准信息交换码)和EBCDIC码(扩展的BCD交换码)。

在 ASCII 编码中,一个英文字母字符存储需要1个字节。

在 GB 2312 编码或 GBK 编码中,一个汉字字符存储需要2个字节。

在UTF-8编码中,一个英文字母字符存储需要1个字节,一个汉字字符储存需要3到4个字节。

在UTF-16编码中,一个英文字母字符或一个汉字字符存储都需要2个字节(Unicode扩展区的一些汉字存储需要4个字节)。

在UTF-32编码中,世界上任何字符的存储都需要4个字节。 

[csharp] view plain copy
 print?
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Web;  
  6.   
  7. namespace ConsoleApplication2  
  8. {  
  9.     class Program  
  10.     {  
  11.         static void Main(string[] args)  
  12.         {  
  13.             //1.字符串编码转换  
  14.             string testStr = "测试字符串,abcd,1234,!@#¥%……&*()——+";  
  15.             Console.WriteLine(testStr);  
  16.             string encodStr = TransferEncoding(Encoding.UTF8, Encoding.Default, testStr);  
  17.             Console.WriteLine("UTF8编码:" + encodStr);  
  18.             encodStr = TransferEncoding(Encoding.Default, Encoding.UTF8, encodStr);  
  19.             Console.WriteLine("UTF8解码:" + encodStr);  
  20.   
  21.             Console.WriteLine("=================================");  
  22.   
  23.             //2.html转码  
  24.             testStr = "测试字符串,a<dl></dl>% ";  
  25.             Console.WriteLine(testStr);  
  26.             testStr=HtmlEncode(testStr);  
  27.             Console.WriteLine("HtmlEncode编码:" + testStr);  
  28.             testStr = HtmlDecode(testStr);  
  29.             Console.WriteLine("HtmlDecode解码:" + testStr);  
  30.   
  31.             Console.WriteLine("=================================");  
  32.   
  33.             //3.Url转码,对#处理有问题  
  34.             //使用HttpUtility.UrlEncode对传参进行编码,使用HttpUtility.UrlDecode对传参进行解码,貌似十分正常。  
  35.             //但HttpUtility.UrlEncode和HttpUtility.UrlDecode的搭配对"+"处理混乱:  
  36.             //HttpUtility.UrlEncode: +变为+  
  37.             //对于有些情况下,+已经事先变为+,而此时再用HttpUtility.UrlDecode,+会变成空格。  
  38.             testStr = "http://www.baidu.com?username=<find>&content=ab# c哈哈哈";  
  39.             Console.WriteLine(testStr);  
  40.             testStr = UrlEncode(testStr);  
  41.             Console.WriteLine("UrlEncode编码:" + testStr);  
  42.             testStr = UrlDecode(testStr);  
  43.             Console.WriteLine("UrlDecode解码:" + testStr);  
  44.   
  45.             Console.WriteLine("=================================");  
  46.   
  47.             //4.Base64转码  
  48.             testStr = "Coming from the new world!哈哈哈";  
  49.             Console.WriteLine(testStr);  
  50.             testStr = ToBase64(Encoding.Default,testStr);  
  51.             Console.WriteLine("ToBase64编码:" + testStr);  
  52.             testStr = FromBase64(Encoding.Default, testStr);  
  53.             Console.WriteLine("FromBase64 解码:" + testStr);  
  54.   
  55.             Console.WriteLine("=================================");  
  56.             //5.Uri.EscapeDataString()  
  57.             testStr = "http://www.baidu.com?username=<find>&content=ab# c哈哈哈";  
  58.             Console.WriteLine(testStr);  
  59.             testStr= Uri.EscapeDataString(testStr);  
  60.             Console.WriteLine(testStr);  
  61.         }  
  62.           
  63.         /// <summary>  
  64.         /// 字符串编码转换  
  65.         /// </summary>  
  66.         /// <param name="srcEncoding">原编码</param>  
  67.         /// <param name="dstEncoding">目标编码</param>  
  68.         /// <param name="srcBytes">原字符串</param>  
  69.         /// <returns>字符串</returns>  
  70.         static string TransferEncoding(Encoding srcEncoding, Encoding dstEncoding, string srcStr)  
  71.         {  
  72.             byte[] srcBytes = srcEncoding.GetBytes(srcStr);  
  73.             byte[] bytes = Encoding.Convert(srcEncoding, dstEncoding, srcBytes);  
  74.             return dstEncoding.GetString(bytes);  
  75.         }  
  76.   
  77.         /// <summary>  
  78.         /// 2.html转码  
  79.         /// </summary>  
  80.         /// <param name="html"></param>  
  81.         /// <returns></returns>  
  82.         static string HtmlEncode(string html)  
  83.         {  
  84.             return HttpUtility.HtmlEncode(html); //System.Net.WebUtility.HtmlEncode(html);              
  85.         }  
  86.   
  87.         /// <summary>  
  88.         /// 2.html解码  
  89.         /// </summary>  
  90.         /// <param name="html"></param>  
  91.         /// <returns></returns>  
  92.         public static string HtmlDecode(string html)  
  93.         {  
  94.             return HttpUtility.HtmlDecode(html);//System.Net.WebUtility.HtmlDecode(html);    
  95.         }  
  96.   
  97.         /// <summary>  
  98.         /// 3.Url转码  
  99.         /// </summary>  
  100.         /// <param name="url"></param>  
  101.         /// <returns></returns>  
  102.         public static string UrlEncode(string url)  
  103.         {  
  104.             return HttpUtility.UrlEncode(url);  
  105.         }  
  106.   
  107.         /// <summary>  
  108.         /// 3.Url解码  
  109.         /// </summary>  
  110.         /// <param name="url"></param>  
  111.         /// <returns></returns>  
  112.         public static string UrlDecode(string url)  
  113.         {  
  114.             return HttpUtility.UrlDecode(url);  
  115.         }  
  116.   
  117.         /// <summary>  
  118.         /// 4.Base64转码  
  119.         /// </summary>  
  120.         /// <param name="input"></param>  
  121.         /// <returns></returns>  
  122.         public static string ToBase64(Encoding encod,string input)  
  123.         {  
  124.             byte[] bytes = encod.GetBytes(input);  
  125.             return Convert.ToBase64String(bytes);  
  126.         }  
  127.   
  128.         /// <summary>  
  129.         /// 4.Base64字符串解码  
  130.         /// </summary>  
  131.         /// <param name="input"></param>  
  132.         /// <returns></returns>  
  133.         public static string FromBase64(Encoding encod,string input)  
  134.         {  
  135.             byte[] bytes = Convert.FromBase64String(input);  
  136.             return encod.GetString(bytes);  
  137.         }  
  138.     }  
  139. }  

在开发过程中,出现编码后乱码的情况,要沉着冷静,从编码的出发点以及实际字符传递的过程中去发现问题。这样才能避免解码出现乱码的情况。


原创粉丝点击