同桌上课用手指进去了好爽_欧美丰满熟妇xxⅹⅹ性大i_成人av天天日天天拍拍_猛男gay帅男gay男男同志_欧美va天堂在线观看_人妻无码av中文系列三里桃花_亚欧免费无码在线观看_久久久精品国产亚洲av水_日韩在线免费看污污污_2021无码专区人妻系列日韩

首頁(yè) 優(yōu)化推廣 .NET/C#中 System.Text.Encoding 類的一個(gè)簡(jiǎn)單用法

.NET/C#中 System.Text.Encoding 類的一個(gè)簡(jiǎn)單用法

來(lái)源: | 時(shí)間:2013/10/30 9:41:26 |

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)的卻是:

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

 

那這個(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 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[]的長(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)題。

 

服務(wù)熱線

153 8323 9821

功能和特性

價(jià)格和優(yōu)惠

網(wǎng)站和維護(hù)

推廣和優(yōu)化

微信服務(wù)號(hào)