字符串是由一個個字符組成的,每個字符又有一個或多個字節來表示,每個字節又由8個bit位來表示
在C#裡 字符串通常由string來聲明,字符由char來聲明,字節由byte來表示,位由bit來表示,具體分析見下面的測試代碼分析:
完整測試代碼:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Linq.Expressions; 5 using System.Text; 6 using System.Threading.Tasks; 7 using System.IO; 8 namespace CSharpRumenJD 9 { 10 class Program 11 { 12 static void Main(string[] args) 13 { 14 15 string unicodestr = "啊?/123"; 16 Console.WriteLine("字符串:" + unicodestr); 17 Console.WriteLine("字符長度:" + unicodestr.Length); 18 Console.WriteLine("Unicode字節長度:" + System.Text.Encoding.Unicode.GetByteCount(unicodestr)); 19 var unicodebytes = System.Text.Encoding.Unicode.GetBytes(unicodestr); 20 Console.WriteLine("gb2312字節長度:" + Encoding.GetEncoding("gb2312").GetByteCount(unicodestr)); 21 var gb2312bytes = System.Text.Encoding.GetEncoding("gb2312").GetBytes(unicodestr); 22 #region 亂碼測試 23 var gb2312tounidecodestr = System.Text.Encoding.Unicode.GetString(gb2312bytes); 24 Console.WriteLine("gb2312bytes轉化成Unicode字符串:" + gb2312tounidecodestr); 25 var gb2312str = System.Text.Encoding.GetEncoding("gb2312").GetString(gb2312bytes); 26 Console.WriteLine("gb2312bytes字符串:" + gb2312str); 27 #endregion 28 #region 打印二進制數據 29 int capacity = gb2312bytes.Length * 8; 30 StringBuilder sb = new StringBuilder(capacity); 31 for (int i = 0; i < gb2312bytes.Length; i++) 32 { 33 sb.Append(gb2312bytes[i] + ":" + Convert.ToString(gb2312bytes[i], 2).PadLeft(8, '0') + "|"); 34 } 35 Console.WriteLine(sb.ToString().TrimEnd('|')); 36 #endregion 37 StreamWriter sw = new StreamWriter("1.txt", false, System.Text.Encoding.Unicode); 38 sw.Write(unicodestr); 39 sw.Close(); 40 StreamWriter sw1 = new StreamWriter("2.txt", false, Encoding.GetEncoding("gb2312")); 41 sw1.Write(unicodestr); 42 sw1.Close(); 43 Console.ReadKey(); 44 } 45 } 46 } View Code測試結果:
通過測試結果可以看到同樣一個字符串,
通過Unicode編碼獲取的字節長度為12,通過GB2312獲取的字節長度為7,
而且使用Unicode去把GB2312編碼的的字節數組轉化成字符串時出現亂碼問題,使用GB2312的編碼方式把GB2312編碼的字節數組轉化成字符串時沒有任何問題的,
疑問一:為什麼兩種編碼方式得到的字節長度不同呢?
Unicode碼:Unicode碼也是一種國際標准編碼,Unicode目前普遍采用的是UCS-2,它用兩個字節來編碼一個字符(多虧了ohmygirl的指點),C#中的Unicode默認使用UTF-16編碼格式,所以上面的字符串的字節長度為12,
GB2312編碼是ANSI編碼中的一個分支,在使用 ANSI 編碼支持多種語言階段,每個字符使用一個字節或多個字節來表示(MBCS),因此,這種方式存放的字符也被稱作多字節字符。比如,"啊?/123"長度為7個字節,每個漢字占2個字節,每個英文和數字字符占1個字節,
字符與編碼的發展