Encoding 是System.Text 命名空间下面的一个类,顾名思义,它是字符编码相关的一个类。因为在.NET平台上我们最多用的字符串,以及字符型都是UNICODE编码方式的,因此处理对象也多以UNICODE字符串为主。
这个类有大概40个方法,具体可查MSDN,其中有5 个是静态方法可以由 Encoding 类来直接调用,但其实这5个是最不常用的方法:
平常更容易看见的却是:
那这个Default 又是什么东西呢,原来它是 Encoding 类的一个静态 Property 它的类型仍然是Encoding 类,那这儿莫非是用了个Singlinton模式么? i dont know...
public static Encoding Default { get; }
所以,上面那些除5个静态方法以外的方法,就要通过这种方式 System.Text.Encoding.Default.XXXX 来调用。
另外同样,既然能 string 转 byte[] ,那当然也能byte[] 转 string 了:
接着看下面的情况:
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
还是差异很大呀,不注意估计要出问题。