思维的乐趣

Enjoy it
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

.NET/C#中 System.Text.Encoding 类的一个简单用法

Posted on 2010-06-22 15:35  szh114  阅读(20499)  评论(0编辑  收藏  举报

Encoding 是System.Text 命名空间下面的一个类,顾名思义,它是字符编码相关的一个类。因为在.NET平台上我们最多用的字符串,以及字符型都是UNICODE编码方式的,因此处理对象也多以UNICODE字符串为主。

这个类有大概40个方法,具体可查MSDN,其中有5 个是静态方法可以由 Encoding 类来直接调用,但其实这5个是最不常用的方法:

 

平常更容易看见的却是:

byte[] byteArray = System.Text.Encoding.Default.GetBytes(  str  );

 

那这个Default 又是什么东西呢,原来它是 Encoding 类的一个静态 Property 它的类型仍然是Encoding 类,那这儿莫非是用了个Singlinton模式么? i dont know...

public static Encoding Default { get; }

所以,上面那些除5个静态方法以外的方法,就要通过这种方式 System.Text.Encoding.Default.XXXX 来调用。

 

另外同样,既然能 string 转 byte[] ,那当然也能byte[] 转 string 了:

 

string str = System.Text.Encoding.Default.GetString( byteArray );

 

接着看下面的情况:

            string s = "test!";

 

            byte[] byteArray = Encoding.Default.GetBytes(s);

            Console.WriteLine(byteArray.Length);

            foreach (byte b in byteArray)
            {
                Console.WriteLine(b);
            }

 

如上这段代码,得到BYTE[]的长度是 5 ,我本来想当然地以为会是10呢,因为UNICODE的一个字符编码要占两个字节,但事实上Length这个属性输出的东西是数组的元素个数,并非它的实际字节长度。

可问题是既然一个UNICODE字符要2个字节才能存储,那它的二进制值也必然要大于byte所能容纳的一个字节呀,一一对应的话,如果那个字符的UNICODE值太大,溢出了byte的容纳范围,(众所周知,byte 的聚会范围仅是0-255)会怎么样呢???????为什么要将string 类型转换成 byte[] 呢??????

 

我将上面的string 换了一下:

 

     string s = "我test!";

这次,输出长度为7!也就是说最前面的这个汉字用了两个byte来存储,而后面的仍然是一个字符一个byte。也就是说,一个字符串,被转换成byte[]时,内部进行了优化的,避免了不必要的内存分配。这点一定要有明确的意识!!!!!!

 

还要进一步注意的是,如果按下面这种方式显式要求得到一个UNICODE编码的byte[]的话,得到的就是真正的两byte一字符的结果了:

 

            Encoding uni = Encoding.Unicode;
            byte[] ba = uni.GetBytes(s);

 

            Console.WriteLine(ba.Length);                   // 这次的结果是 12

            foreach (byte b in ba)
            {
                Console.WriteLine(b);
            }

 

 

对比一下两次的输出结果:

 

206
210
116
101
115
116
33



17
98
116
0
101
0
115
0
116
0
33
0

 

还是差异很大呀,不注意估计要出问题。