字符集及编码
字符集(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类定义如下:
Encoding类的派生类有ASCIIEncoding,UnicodeEncoding,UTF8Encoding类等,提供不同特定编码的覆写。
下面以字符“message,信息”(英文,半角逗号,中文)为例,来看看各编码的表示
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 |
从字节数组到字符的转换
string s = Encoding.UTF8.GetString(b);
s的值为“message,信息”。字节数组是utf-8的编码,如果采用gb2312来GetString,则得到的中文字符会是乱码:message,淇℃伅