谈谈字符编码的问题

一、字符编码历史

  字符编码历史,这里我们引入园友的文章:
    计算机一开始发明的时候是用来解决数字计算的问题,后来人们发现,计算机还可以做更多的事,例如文本处理。但由于计算机只识“数”,因此人们必须告诉计算机哪个数字来代表哪个特定字符,例如65代表字母‘A’,66代表字母‘B’,以此类推。但是计算机之间字符-数字的对应关系必须得一致,否则就会造成同一段数字在不同计算机上显示出来的字符不一样。因此美国国家标准协会ANSI制定了一个标准,规定了常用字符的集合以及每个字符对应的编号,这就是ASCII字符集(Character Set),也称ASCII码。
    当时的计算机普遍使用8比特字节作为最小的存储和处理单元,加之当时用到的字符也很少,26个大小写英文字母还有数字再加上其他常用符号,也不到100个,因此使用7个比特位就可以高效的存储和处理ASCII码,剩下最高位1比特被用作一些通讯系统的奇偶校

二、各编码的结构特征


  此后就出现了各国不够用的情况,所以陆续出现格式版本.

  UTF-8:将部分字符编码成一个字节,将部分字符编码成2个字节,将部分字符编码成3个字节,将部分字符编码成4个字节.将128(0X0080)以下的编码成 1个字节(赢美),将(0X0080-0X07FF)编码成两个字节(欧洲,东亚),0X07FF以上使用3个字节编码,最后代理项对编码成4个字节.

  UTF-16:将每个16位字符编码成两个字节,因为不会存在压缩处理,所以性能很好.它也称为UNIOCDE编码

  UTF-32:使用四个字节来编码所有字符,看似万能,但处理性能较低.

  UTF-7:已被UNICODE协会淘汰.

  ASCII:将16字符编码成ascii字符,小于128的的16字符将被用单字节保存所以效率很好,超过的0X07FF的字符是不能转换的,否则字符值会丢失.

 

 三、C#编码解码例子


此处引用http://blog.csdn.net/xyjnzy/article/details/5072057
//1.获得汉字的区位码
byte[] array = new byte[2];
array = System.Text.Encoding.Default.GetBytes("");

int i1 = (short)(array[0] - ''/0'');
int i2 = (short)(array[1] - ''/0'');


//2.unicode解码方式下的汉字码
array = System.Text.Encoding.Unicode.GetBytes("");
i1 = (short)(array[0] - ''/0'');
i2 = (short)(array[1] - ''/0'');


//3.unicode反解码为汉字
string str = "4a55";
string s1 = str.Substring(0,2);
string s2 = str.Substring(2,2);


int t1 = Convert.ToInt32(s1,16);
int t2 = Convert.ToInt32(s2,16);


array[0] = (byte)t1;
array[1] = (byte)t2;


string s = System.Text.Encoding.Unicode.GetString(array);


//4.default方式反解码为汉字
array[0] = (byte)196;
array[1] = (byte)207;
s = System.Text.Encoding.Default.GetString(array);


//5.取字符串长度
s = "iam方枪枪";
int len = s.Length;//will output as 6
byte[] sarr = System.Text.Encoding.Default.GetBytes(s);
len = sarr.Length;//will output as 3+3*2=9


//6.字符串相加
System.Text.StringBuilder sb = new System.Text.StringBuilder("");
sb.Append("i ");
sb.Append("am ");
sb.Append("方枪枪");

string --> byte array

byte[] data=Syste.Text.Encoding.ASCII.GetBytes(string);

string --> byte

byte data = Convert.ToByte(string);

byte[]-->string

string string = Encoding.ASCII.GetString( bytes, 0, nBytesSize );

 


 

 

 四、Encodiing类的使用


  Encodiing类中提供了许多静态属性如:Unicode,UTF32,UTF7,ASCII,Default等,它们会返回一个对象用于处理对应的字符编码,值得注意的是不要使用Default属性,因为如此以来,您开发的程序就会受到运行计算机的影响,它会使用当前计算机中所默认的字符编码处理方案.

 

 

五、您若觉得不错的,请支持.

posted @ 2014-08-28 19:43  迅捷网络[来送福利]  阅读(727)  评论(0编辑  收藏  举报