所有的鸟儿他们都知道, 他们的巢应该筑在什么地方, 鸟儿知道自己该在什么地方筑巢, 那就意味着他们了解他们自己的使命。 我们身为万物之灵的人类, 怎么会不知道,连鸟儿都知道的道理呢?
C#.net 中的编码 -Encoding
C#.net 中的编码 -Encoding

C#.net 中的编码 -Encoding

   在c#中提供了编码类Encoding,它有四种编码方案:

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

     另外还有我们所熟悉的GB2312编码,但是它不是Encoding类下的显示类。尽管如此我们仍然可以使用,Encoding encoder = Encoding.GetEncoding("gb2312");
 各种编码类型不一定是兼容的,尤其是在有中文的情况下。在解码从文件读取字节数据时,这一点有重要的影响。
     例如:用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进行编码,在网络中传输数据都默认这种方式。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注