数据编码与解码

一、各种字符编码 

1、ASCII字符集

 ASCII字符集是针对英语设计的。 

 7位ASCII字符集由128个字符组成,包括大小写字母、数字0~9、标点符号、非打印字符(换行符、制表符等4个)以及控制字符(退格、响铃)。

2、 非ASCII字符集

(1)GB2312-1980编码 :中文编码,汉字都采用双字节编码。

(2)GB18030:针对GB2312的扩展,编码的汉字更多 ,其编码长度为1~4个字节。

3、Unicode字符集 

(1)为了使国家信息交流更加方便,国际组织制定了Unicode字符集。它为各种语言的每一个字符规定了统一并且唯一的字符,这种编码只占用2个字节就可以表示地球上绝大部分地区的文字。

(2)在C#中字符默认都是Unicode码

(3)由于它比ASCII占用大一倍的空间,为了解决这个问题,又出现了一些中间格式的字符集,它们被称为通用转换格式,即UTF,目前流行的UTF格式有UTF-8、UTF-16以及UTF-32。 

 二、Encoding类,位于System.Text命名空间下

  名称 说明
   ASCII属性 获取 ASCII(7 位)字符集的编码。
  WebName 在派生类中重写时,获取在 Internet 编号分配管理机构 (IANA) 注册的当前编码的名称。
BodyName 在派生类中重写时,获取可与邮件代理正文标记一起使用的当前编码的名称。
  CodePage 在派生类中重写时,获取当前 Encoding 的代码页标识符。
   UTF8 获取 UTF-8 格式的编码。
   Default 获取操作系统的当前 ANSI 代码页的编码。
   UTF7 获取 UTF-7 格式的编码。
EncodingName 在派生类中重写时,获取当前编码的可读说明。
HeaderName 在派生类中重写时,获取可与邮件代理标题标记一起使用的当前编码的名称。
  UTF32 获取使用 Little-Endian 字节顺序的 UTF-32 格式的编码。
   Unicode 获取使用 Little-Endian 字节顺序的 UTF-16 格式的编码。
方法 Convert  将字节数组从一种编码转换为另一种编码。

GetBytes 将一组字符编码为一个字节序列

GetString 将一个字节序列编码为一个字符串

GetEncoder 获取一个解码器,该解码器将Unicode字符序列转换为已编码的字节序列。

GetDecoder 在派生类中重写时,获取一个解码器,该解码器将已编码的字节序列转换为字符序列。
 

  GetEncodings 返回一个数组,包含所有的编码。

 

   GetEncoding(Int32) 返回与指定代码页标识符关联的编码。
   GetEncoding(String) 返回与指定代码页名称关联的编码。

 1、获取所有的编码名称及其描述信息

         ListBox1.Items.Add(string.Format("{0:-18}{1}""Name""EncodingName"));

         foreach (EncodingInfo ei  in  Encoding.GetEncodings())
        {
            Encoding en 
=  ei.GetEncoding();
            ListBox1.Items.Add(
string .Format( " {0:-18}{1} " , ei.Name, en.EncodingName));                
        } 

 2、不同编码之间的转换

        string  unicodeString  =   " 该字符串包含unicode字符Pi(\u03a0) " ;
        Encoding unicode 
=  Encoding.Unicode;
        Encoding utf8 
=  Encoding.UTF8;
        
// 利用unicode对象的GetBytes方法把Unicode字符编码为Unicode字节数组
         byte [] unicodeBytes  =  unicode.GetBytes(unicodeString);
        
// 利用Encoding的Convert方法将Unicode字节数组转换为UTF8字节数组
         byte [] utf8Bytes  =  Encoding.Convert(Encoding.Unicode, Encoding.UTF8, unicodeBytes);
        
// 利用对象UTF8的GetString方法将UTF8字节数组解码为UTF8字符串
         string  utf8String  =  utf8.GetString(utf8Bytes);

 结果为:

该字符串包含unicode字符Pi(Π)

 

 三、Encoder类和Decoder类 

1、Encoder类位于System.Text命名空间下,利用它可以将一组字符转换为一个字节序列。利用Encoder类对字符进行编码时,首先要获取Encoder类的实例,因为Encoder的构造函数为protected,因此不能直接实例化,而要借助Encoding提供的GetEncoder方法创建实例。

//获取ASCII编码的Encoder实例

Encoder asciiEncoder=Encoding.ASCII.GetEncoder(); 

2、GetByteCount方法, 

计算对指定字符数组中的一组字符进行编码所产生的字节数,GetByteCount(char[] chars(包含要编码的字符集的字符数组),int index,int count,bool flush(是否清空内部缓存状态))

 

  char[] chars = new char[]

        {
            
' \u0023 ' , // #
             ' \u0025 ' , // %
             ' \u03a0 ' // Pi
        };
        Encoder encoder 
=  Encoding.UTF8.GetEncoder();
        Byte[] bytes 
=   new  Byte[encoder.GetByteCount(chars,  0 , chars.Length,  true )];
        
// 将字符编码chars转换为字节数组
        encoder.GetBytes(chars,  0 , chars.Length, bytes,  0 true );
        Response.Write(Encoding.UTF8.GetString(bytes));

结果为:

#%Π 

 

3、Decoder类将已编码的字节序列解码为字符序列。

        string  strResult  =   "" ;
        Byte[] bytes 
=   new  Byte[] {  80 0 110 0 105 99  };
        Decoder unicodeDecoder 
=  Encoding.Unicode.GetDecoder();
        
int  charCount  =  unicodeDecoder.GetCharCount(bytes,  0 , bytes.Length);
        
char [] chars  =   new   char [charCount];
        
// 将字节序列解码为字符序列
        unicodeDecoder.GetChars(bytes,  0 , bytes.Length, chars,  0 );
        
foreach  ( char  c  in  chars)
        {
            strResult 
+=  c.ToString();
        }

        Response.Write(strResult); 

 结果为:Pn捩

你可能感兴趣的:(编码)