首先 我們寫兩個代碼
1.byte[] q= System.Text.Encoding.UTF8.GetBytes("哈");
2.
MemoryStream stream = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, "哈");
stream.Close();
byte[] qq=stream.ToArray();
第一個方法是把"哈"字串轉換成UTF8碼,第二個是序列化"哈"
不同之處在於
一.
1是單純的轉碼
2是序列化"哈"這個字串對象,一個對象包括很對內容(屬性,方法,索引器等等)
序列化對象就是把對象變成byte[]的格式,因為對象的成員很複雜,而且類型不同,所以變起來沒有轉碼那麼簡單
二.
我們會發現,2並沒有指定編碼格式,難道序列化就不需要指定編碼格式嗎,那當然是不可能的,通過我實驗當序列化對象時,把對象中資料成員的字串轉化為byte[]是按照UTF8碼來做的,其它類型我沒有實驗
那為什麼要用UTF8而不用Unicode?
看一下 下面的解釋
UTF8效率
1.每個英文字母、數字所佔的空間為1 Byte;
2.泛歐語系、斯拉夫語字母佔2 Bytes;
3.漢字佔3 Bytes。
用Unicode的話,英文也變成2 Bytes了
原來老美是為了照顧自己 而損失了漢語的效率,明白了了吧
由此可見UTF8對英文來說是個非常誘人的方案,但對中文來說則不太合算,無論用ANSI還是 Unicode/UCS2來編碼都只用2 Bytes,但用UTF8則需要3 Bytes。
以下是一些統計資料,顯示用UTF8來儲存檔案每個字元所需的平均位元組:
1.拉丁語系平均用1.1 Bytes;
2.希臘文、俄文、阿拉伯文和希伯萊文平均用1.7 Bytes;
3.其他大部份文字如中文、日文、韓文、Hindi(北印度語)用約3 Bytes;
4.用超過4 Bytes的都是些非常少用的文字元號。
一開始我用序列化的時候,我就很奇怪,為什麼不用指定編碼,原來不是沒指定,而是序列化對象自身已經做好了演算法,(有可能針對不同類型用了很多不同的編碼,自訂很複雜,失去了意義,系統指定的最佳化編碼)並沒有提供給外接指定編碼的介面(可以自訂序列化,但不知道可不可以自訂序列化編碼)
一家之言,不敢肯定是正確的,作為參考吧