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
還是差異很大呀,不注意估計要出問題。