C#.net 中的編碼 -Encoding

2007-03-23  作者:龔軍勇  http://www.flyy.info/blog/index.php?blogid=274
description:
   在c#中提供了編碼類Encoding,它有四種編碼方案:

1、ASCIIEncoding
2、UnicodeEncoding
3、UTF7Encoding
4、UTF8Encoding

     另外還有我們所熟悉的GB2312編碼,但是它不是Encoding類下的顯示類。儘管如此我們仍然可以使用,Encoding encoder = Encoding.GetEncoding("gb2312");
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script> <iframe width="468" scrolling="no" height="60" frameborder="0" allowtransparency="true" hspace="0" vspace="0" marginheight="0" marginwidth="0" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-2801850660129274&dt=1205810831203&lmt=1205810830&format=468x60_as&output=html&correlator=1205810831031&url=http%3A%2F%2Fwww.flyy.info%2Fblog%2Findex.php%3Fblogid%3D274&color_bg=FFFFFF&color_text=000000&color_link=0000FF&color_url=008000&color_border=FFFFFF&ad_type=text_image&ref=http%3A%2F%2Fcache.baidu.com%2Fc%3Fm%3D9d78d513d9821cfe01bad2690d6782360e55f0633dd4d0027fa5c25f93654f060738ece161645213d2b6617a44ea0c4bea87622c7c4837b7ec93d41e80a6c27672dd3a6f2c4ad10b05d36eed910432c054c004b4fa42b1adf14493abd4%26p%3D97759a46d38608ef12be9b7f0d4ec9%26user%3Dbaidu&frm=0&cc=100&ga_vid=823929652.1205810831&ga_sid=1205810831&ga_hid=1137843022&flash=9.0.115&u_h=768&u_w=1024&u_ah=734&u_aw=1024&u_cd=32&u_tz=480&u_his=2&u_java=true&u_nplug=7&u_nmime=20" name="google_ads_frame"></iframe> <script type="text/javascript"> function dispaly(id){ var div=document.getElementById(id); if(div.style.visibility=='visible'){div.style.visibility='hidden'} else div.style.visibility='visible'; } </script>
 各種編碼類型不一定是兼容的,尤其是在有中文的情況下。在解碼從文件讀取字節數據時,這一點有重要的影響。
     例如:用unicode編碼方案寫入的數據不能使用ASCII或UTF-8編碼方案正確的解碼。這是因爲unicode編碼使用兩個字節表示每個字符,而其他方案不是這樣。

1、首先來看一下編碼後的字節數組內容
     我們寫了以下程序進行驗證這一點:
     對於這段字符串 string str="測試文本 Test Text" 分別通過GB2312和UTF8對其進行編碼,得到以下字節數組:
     -------------------------------GB2312-----------------
   178   226   202   212   206   196   177   190   32   84   101   115   116   32   84   101   120   116

     ------------------------------UTF8------------------
   230   181   139   232   175   149   230   150   135   230   156   172   32   84   101   115   116   32   84   101   120   116
  
可以看出對於中文兩者編碼後的字節是不一樣的,對於英文和空格的編碼是一樣的。

2、兩種編碼方案保存到文本的情況
    對於同一段字符串 string str="測試文本 Test Text" 分別通過GB2312和UTF8對其進行編碼,然後分別保存爲兩個文本文件,代碼如下:

private void GetUTF8()
  {
   Encoding encoder=Encoding.UTF8 ;
   byte[] buff = new byte[encoder.GetByteCount(str)] ;
   int j = encoder.GetBytes(str,0,str.Length,buff,0) ;
   this.textBox1.Text += " -------------------------------UTF8------------------ ";

   for(int i=0;i<buff.Length;++i)
   {
    this.textBox1.Text += "   "+buff[i];
   }
   FileStream fs = File.Create(@"E:WinFormWindowsApplication1WindowsApplication1UTF8.txt");
   fs.Write(buff,0,buff.Length) ;
   fs.Close();
  }

打開記事本都可以正常顯示中文,接下來在對文本進行讀取顯示:
A、用GB2312方案讀gb2312寫入的文本顯示正常

  FileStream fs = File.OpenRead(@"E:WinFormWindowsApplication1WindowsApplication1GB2312.txt");
   byte[] buff = new byte[(int)fs.Length] ;
   fs.Read(buff,0,buff.Length);
   Encoding encoder = Encoding.GetEncoding("gb2312");
   string str1 = encoder.GetString(buff,0,buff.Length);
   this.textBox1.Text = "-------------GB2312 Encode---------------- " + str1 +" ";

B、用Gb2312方案讀取Utf8編碼寫入的文本顯示如下:
    ? Test Text
C、用UTF8讀取GB2312寫入的文本顯示如下:
   嫺????? Test Text
這正是我們經常遇見的亂碼,多少情況都是編碼方案不對應。

一般來說我們都採用UTF8進行編碼,在網絡中傳輸數據都默認這種方式。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章