字元集(CharSet)編碼不同,資料的儲存空間大小也不同,選擇不當還會出現亂碼等,特別是資料互動的地方,發送與接收應該保持編碼一致。
ASCII碼是最早最基礎的編碼,採用7位(bit)表示一個字元,一共可表示2的7次方=128種字元,後來有了Latin1(ISO-8859-1)對ASCII進行了擴充,使用8位(bit)也就是一個位元組表示一個字元,可表示2的8次方=256種字元,相比ASCII可以表示更多的特殊字元,但對於一些地區,如中文這樣字元遠遠不夠,為瞭解決這種問題,Unicode編碼出現了,旨在能表示所有地區的字元,針對特定的地區還有針對性的編碼,如中文的gb2312等。
Unicode編碼使用兩個位元組表示一個字元,可表示2的16次方=65536個字元,當一份文檔中的字元大多是英文或純英文時,使用Unicode就顯得有點浪費空間。而utf-8編碼可以解決此類問題,它遇到英文時使用同ASCII編碼,但遇到如中文字元時,一個字元用3個位元組來表示。而gb2312遇到中文用2個位元組來表示。
.NET中的位於System.Text下的Encoding類是各種編碼的核心類,提供了位元組數組與字元之間的轉換,及各種編碼間的轉換,Encoding類定義如下:
public abstract class Encoding : ICloneable
Encoding類的衍生類別有ASCIIEncoding,UnicodeEncoding,UTF8Encoding類等,提供不同特定編碼的覆寫。
下面以字元“message,資訊”(英文,半形逗號,中文)為例,來看看各編碼的表示
string result = "";
string s = "message,資訊";
byte[] b = Encoding.UTF8.GetBytes(s);
//byte[] b = Encoding.Unicode.GetBytes(s);
//byte[] b = Encoding.GetEncoding("gb2312").GetBytes(s);
foreach (byte i in b)
{
result += i.ToString() + ",";
}
result的值為“109,101,115,115,97,103,101,44,228,191,161,230,129,175”
| |
m |
e |
s |
s |
a |
g |
e |
, |
信 |
息 |
| utf-8 |
109 |
101 |
115 |
115 |
97 |
103 |
101 |
44 |
228,191,161 |
230,129,175 |
| unicode |
109,0 |
101,0 |
115,0 |
115,0 |
97,0 |
103,0 |
101,0 |
44,0 |
225,79 |
111,96 |
| gb2312 |
109 |
101 |
115 |
115 |
97 |
103 |
101 |
44 |
208,197 |
207,162 |
從位元組數組到字元的轉換
byte[] b = new byte[] { 109, 101, 115, 115, 97, 103, 101, 44, 228, 191, 161, 230, 129, 175 };
string s = Encoding.UTF8.GetString(b);
s的值為“message,資訊”。位元組數組是utf-8的編碼,如果採用gb2312來GetString,則得到的中文字元會是亂碼:message,淇℃伅