服務(wù)熱線
153 8323 9821
Encoding 是System.Text 命名空間下面的一個(gè)類,顧名思義,它是字符編碼相關(guān)的一個(gè)類。因?yàn)樵?NET平臺(tái)上我們最多用的字符串,以及字符型都是UNICODE編碼方式的,因此處理對(duì)象也多以UNICODE字符串為主。
這個(gè)類有大概40個(gè)方法,具體可查MSDN,其中有5 個(gè)是靜態(tài)方法可以由 Encoding 類來(lái)直接調(diào)用,但其實(shí)這5個(gè)是最不常用的方法:
平常更容易看見(jiàn)的卻是:
那這個(gè)Default 又是什么東西呢,原來(lái)它是 Encoding 類的一個(gè)靜態(tài) Property 它的類型仍然是Encoding 類,那這兒莫非是用了個(gè)Singlinton模式么? i dont know...
public static Encoding Default { get; }
所以,上面那些除5個(gè)靜態(tài)方法以外的方法,就要通過(guò)這種方式 System.Text.Encoding.Default.XXXX 來(lái)調(diào)用。
另外同樣,既然能 string 轉(zhuǎn) byte[] ,那當(dāng)然也能byte[] 轉(zhuǎn) string 了:
接著看下面的情況:
string s = "test!";
byte[] byteArray = Encoding.Default.GetBytes(s);
Console.WriteLine(byteArray.Length);
foreach (byte b in byteArray)
{
Console.WriteLine(b);
}
如上這段代碼,得到BYTE[]的長(zhǎng)度是 5 ,我本來(lái)想當(dāng)然地以為會(huì)是10呢,因?yàn)閁NICODE的一個(gè)字符編碼要占兩個(gè)字節(jié),但事實(shí)上Length這個(gè)屬性輸出的東西是數(shù)組的元素個(gè)數(shù),并非它的實(shí)際字節(jié)長(zhǎng)度。
可問(wèn)題是既然一個(gè)UNICODE字符要2個(gè)字節(jié)才能存儲(chǔ),那它的二進(jìn)制值也必然要大于byte所能容納的一個(gè)字節(jié)呀,一一對(duì)應(yīng)的話,如果那個(gè)字符的UNICODE值太大,溢出了byte的容納范圍,(眾所周知,byte 的聚會(huì)范圍僅是0-255)會(huì)怎么樣呢???????為什么要將string 類型轉(zhuǎn)換成 byte[] 呢??????
我將上面的string 換了一下:
string s = "我test!";
這次,輸出長(zhǎng)度為7!也就是說(shuō)最前面的這個(gè)漢字用了兩個(gè)byte來(lái)存儲(chǔ),而后面的仍然是一個(gè)字符一個(gè)byte。也就是說(shuō),一個(gè)字符串,被轉(zhuǎn)換成byte[]時(shí),內(nèi)部進(jìn)行了優(yōu)化的,避免了不必要的內(nèi)存分配。這點(diǎn)一定要有明確的意識(shí)?。。。。?!
還要進(jìn)一步注意的是,如果按下面這種方式顯式要求得到一個(gè)UNICODE編碼的byte[]的話,得到的就是真正的兩byte一字符的結(jié)果了:
Encoding uni = Encoding.Unicode;
byte[] ba = uni.GetBytes(s);
Console.WriteLine(ba.Length); // 這次的結(jié)果是 12
foreach (byte b in ba)
{
Console.WriteLine(b);
}
對(duì)比一下兩次的輸出結(jié)果:
206
210
116
101
115
116
33
17
98
116
0
101
0
115
0
116
0
33
0
還是差異很大呀,不注意估計(jì)要出問(wèn)題。