字符集及编码

字符集(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类定义如下:

publicabstractclass 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 =newbyte[] { 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,淇℃伅

posted @ 2009-12-31 10:35  chy710  阅读(411)  评论(0编辑  收藏  举报