Encoding类

一、编码分很多种,编码的格式,多少字节表示一个字非常复杂,不懂这个。写几个懂得记下。

  编码与解码:  

  计算机中储存的信息都是用二进制数表示的;而我们在屏幕上看到的英文、汉字等字符是二进制数转换之后的结果。通俗的说,按照何种规则将字符存储在计算机中,如'a'字符用什么表示,称为"编码";反之,将存储在计算机中的二进制数解析显示出来,称为"解码"。在解码过程中,如果使用了错误的解码规则,则会导致出现乱码。

  字符集(Charset):是一个系统支持的所有抽象字符的集合。字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。说白了就是所有的字符。

  字符编码(Character Encoding):是一套法则,使用该法则能够对自然语言的字符的一个集合(如字母表或音节表),与其他东西的一个集合(如号码或电脉冲)进行配对。即在符号集合与数字系统之间建立对应关系,它是信息处理的一项基本技术。通常人们用符号集合(一般情况下就是文字)来表达信息。而以计算机为基础的信息处理系统则是利用元件(硬件)不同状态的组合来存储和处理信息的。元件不同状态的组合能代表数字系统的数字,因此字符编码就是将符号转换为计算机可以接受的数字系统的数,称为数字代码。说白了就是一个将文字和计算机能存储的数据交互的规则。

  常见字符集名称:ASCII字符集、GB2312字符集、BIG5字符集、GB18030字符集、Unicode字符集等。

  ASCII字符集和编码,美国现代英语用。

  BIG5字符集和编码,繁体中文用编码。

  GB2312字符集和编码,简体中文用编码。

  GB18030字符集和编码,是新版的中文简体用编码。

  Unicode是字符集,UTF-32/ UTF-16/ UTF-8是三种字符编码方案。

  至于1个字对应多少个字节,那些就不管了。

进入本人正题,在C#中Encoding类主要用于编码相关的处理。其属性如下:

ASCII           获取 ASCII(7 位)字符集的编码。
BigEndianUnicode     获取使用 Big-Endian 字节顺序的 UTF-16 格式的编码。
BodyName         在派生类中重写时,获取可与邮件代理正文标记一起使用的当前编码的名称。
CodePage          在派生类中重写时,获取当前 Encoding 的代码页标识符。
DecoderFallback       获取或设置当前 Encoding 对象的 DecoderFallback 对象。
Default          获取系统的当前 ANSI 代码页的编码。
EncoderFallback       获取或设置当前 Encoding 对象的 EncoderFallback 对象。
EncodingName       在派生类中重写时,获取当前编码的可读说明。
HeaderName        在派生类中重写时,获取可与邮件代理标题标记一起使用的当前编码的名称。
IsBrowserDisplay     在派生类中重写时,获取一个值,该值指示浏览器客户端是否可以使用当前的编码显示内容。
IsBrowserSave      在派生类中重写时,获取一个值,该值指示浏览器客户端是否可以使用当前的编码保存内容。
IsMailNewsDisplay     在派生类中重写时,获取一个值,该值指示邮件和新闻客户端是否可以使用当前的编码显示内容。
IsMailNewsSave       在派生类中重写时,获取一个值,该值指示邮件和新闻客户端是否可以使用当前的编码保存内容。
IsReadOnly         在派生类中重写时,获取一个值,该值指示当前的编码是否为只读。
IsSingleByte        在派生类中重写时,获取一个值,该值指示当前的编码是否使用单字节码位。
Unicode           获取使用 Little-Endian 字节顺序的 UTF-16 格式的编码。
UTF32           获取使用 Little-Endian 字节顺序的 UTF-32 格式的编码。
UTF7             获取 UTF-7 格式的编码。
UTF8           获取 UTF-8 格式的编码。
WebName        在派生类中重写时,获取在 Internet 编号分配管理机构 (IANA) 注册的当前编码的名称。
WindowsCodePage    在派生类中重写时,获取与当前编码最紧密对应的 Windows 操作系统代码页。

 

刚开属性还看不懂,后来仔细看了看,发现这个类的属性非常奇怪,居然是自己返回自己。例如

public static Encoding UTF8 { get; }  可以看到UTF8这个类返回的是一个Encoding对象。但是又看了看源代码,发现Encoding是一个抽象类,因此基本可以判断,此属性返回是该对象的一个实现类的对象。返回的实现对象的类一般是用它的方法,不懂啊,先记下它的方法。
  

Clone         当在派生类中重写时,创建当前 Encoding 对象的一个浅表副本。
Convert         已重载。 将字节数组从一种编码转换为另一种。
GetByteCount      已重载。 在派生类中重写时,计算对一组字符进行编码所产生的字节数。
GetBytes       已重载。 在派生类中重写时,将一组字符编码为一个字节序列。
GetCharCount      已重载。 在派生类中重写时,计算对字节序列进行解码所产生的字符数。
GetChars       已重载。 在派生类中重写时,将一个字节序列解码为一组字符。
GetDecoder       在派生类中重写时,获取一个解码器,该解码器将已编码的字节序列转换为字符序列。
GetEncoder       在派生类中重写时,获取一个解码器,该解码器将 Unicode 字符序列转换为已编码的字节序列。
GetEncoding      已重载。 返回指定代码页的编码。
GetEncodings      返回包含所有编码的数组。
GetHashCode      已重写。 返回当前实例的哈希代码。
GetMaxByteCount   在派生类中重写时,计算对指定数目的字符进行编码所产生的最大字节数。
GetMaxCharCount   在派生类中重写时,计算对指定数目的字节进行解码时所产生的最大字符数。
GetPreamble      在派生类中重写时,返回指定所用编码的字节序列。
GetString       已重载。 在派生类中重写时,将一个字节序列解码为一个字符串。
IsAlwaysNormalized    已重载。 获取一个值,该值指示当前编码是否始终被正常化。

        static void Main(string[] args)
        {
            string str = "你好吗?";
            byte[] bytes = Encoding.UTF8.GetBytes(str);     //按照UTF8编码规则,编码字符串str,返回bytes数组。这个东西就是8位00000000-11111111存入硬盘的东西
            foreach (byte b in bytes)
            {
                Console.Write(b + " ");             //输出这12个元素看看是什么东西 228 189 ....... 输出的都是byte范围内的数字
            }
            Console.WriteLine("\n共有字节数:" + Encoding.UTF8.GetByteCount(str)); //输出12,也就是bytes数组的元素个数
            Console.WriteLine(Encoding.ASCII.GetString(bytes));    //用另外一种编码规则解码,看看得到什么?    输出 ???????????? 不同与编码规则的解码方法是解码不到值的。
            Console.WriteLine(Encoding.UTF8.GetString(bytes));  //用UTF8编码规则由byte数组,解码回字符串  输出 你好吗? 哈哈终于正确了
            Console.WriteLine(Encoding.UTF8.GetString(bytes, 3, 6));   //该方法的重载允许指定解码的数组范围, 本处输出 好吗      你和问好不解码。
            Console.WriteLine(Encoding.GetEncoding("UTF-8"));   //输出System.Text.UTF8Encoding
            Console.WriteLine(Encoding.UTF8.GetCharCount(bytes));   //返回解码后的字符的个数   此处返回4,正确
            Char[] chArr = Encoding.UTF8.GetChars(bytes);   //将解码后的内容输出到字符数组中
            foreach (char c in chArr)
            {
                Console.Write(c + " - ");   //输出  你 - 好 - 吗 - ? -
            }
            Console.WriteLine(Encoding.UTF8.GetMaxCharCount(12));   //对12个元素的byte数组进行解码产生的最大字符数 13
            Console.WriteLine(Encoding.UTF8.GetMaxByteCount(12));   //对12个字符进行编码产生的最大字节数    39
            Console.ReadKey();
        }

 再来看一道有趣的面试题

        static void Main(string[] args)
        {
            string str = "ab某某";
            int l1 = System.Text.Encoding.UTF8.GetBytes(str).Length;
            Console.WriteLine(l1);      //输出 8
            int l2 = System.Text.Encoding.Default.GetBytes(str).Length;
            Console.WriteLine(l2);      //输出 6
            int l3 = str.Length;
            Console.WriteLine(l3);      //输出 4

            Console.Write(System.Text.Encoding.Default.EncodingName);   //输出 简体中文<GB2312>

            Console.ReadKey();
        }
原文地址:https://www.cnblogs.com/kissdodog/p/2865935.html