在网络通信中,很多情况下都是将字符信息转成字节序列进行传输。将字符序列转为字节序列的过程称为编码。当这些字节传送到接收方,接收方需要逆向将字节序列转为字符序列。这个过程就是解码。

常见编码有ASCII字符集 ,非ASCII字符集 如GB2312 GB18030等,Unicode字符集。

在C#中,字符集默认是Unicode,一个英文占2个字节,一个汉字也占2个字节。Unicode能够表示大部分国家的文字,但是空间占用相对ASCII较为浪费。

为了节约空间,后续出现了UTF-8,UTF-16,UTF-32.

UTF8是使用最为广泛的一种UTF格式。属于Unicode的一种变长字符编码,一般使用1-4个字节编码表示一个Unicode字符,即将一个Unicode字符编为1-4个字节组成的UTF8格式,根据不同符号而变化字节长度。

UTF8字节序列在所有系统中都一样的,所以这样可以很容易的进行排序。

UTF16将每个码位表示为一个由1-2个16位整数组成的序列。

UTF32将每个码位表示为一个32位整数。

===============================================================================

Encoding类位于System.Text空间下,主要用于在不同的编码和Unicode之间进行转换。也就是我们本篇主角。

1         //获得所有编码名称和其描述信息;
2         foreach (EncodingInfo encodingInfo in Encoding.GetEncodings())
3         {
4             Debug.Log(encodingInfo.Name+"///"+encodingInfo.GetEncoding().EncodingName);
5         }

//output: 95种字符集。

 

1         //获取某个指定的编码集;
2         Encoding gb2312 = Encoding.GetEncoding("GB2312");
3         Encoding ascii = Encoding.ASCII;
4         Encoding utf8 = Encoding.GetEncoding("UTF-8");
5         Debug.Log("headName::" + gb2312.HeaderName + "///" + gb2312.EncodingName);
6         Debug.Log("headName::" + ascii.HeaderName + "///" + ascii.EncodingName);
7         Debug.Log("headName::" + utf8.HeaderName + "///" + utf8.EncodingName);

 

1 //不同编码之间转换;
2         string str = "这个字符集是什么鬼?Pi(\u03a0)";
3         Encoding unicode = Encoding.Unicode;
4         Encoding utf_8 = Encoding.GetEncoding("UTF-8");
5         byte[] unicodeBytes = unicode.GetBytes(str);
6         byte[] utf8Bytes = Encoding.Convert(unicode, utf_8, unicodeBytes);
7         string value = utf_8.GetString(utf8Bytes);
8         Debug.Log("UTF8 String=" + value);

编码是将一组 Unicode 字符转换为一个字节序列的过程。与此相反,解码是将已编码的字节序列转换为 Unicode 字符的一组的过程。有关 Unicode 转换格式 (Utf) 和其他支持的编码信息Encoding,请参阅.NET Framework 中的字符编码

请注意,Encoding用于操作而不是任意的二进制数据如字节数组的 Unicode 字符。如果必须对任意二进制数据转换为文本进行编码,则应使用一种协议 (如 uuencode),通过实现的方法如Convert.ToBase64CharArray

.NET Framework 提供的以下实现Encoding类,以支持当前的 Unicode 编码和其他编码:

  • ASCIIEncoding将 Unicode 字符编码为单一 7 位 ASCII 字符。此编码仅支持字符的值之间 U + 0000 和 U + 007F。代码页已选中 20127。此外可通过ASCII属性。

  • UTF7Encoding将使用 utf-7 编码的 Unicode 字符编码。此编码支持所有 Unicode 字符值。代码页已选中 65000。此外可通过UTF7属性。

  • UTF8Encoding将使用 utf-8 编码的 Unicode 字符编码。此编码支持所有 Unicode 字符值。代码页已选中 65001。此外可通过UTF8属性。

  • UnicodeEncoding将使用 utf-16 编码的 Unicode 字符编码。这两个小 endian 和 big endian 字节订单都受支持。此外可通过Unicode属性和BigEndianUnicode属性。

  • UTF32Encoding将使用 utf-32 编码的 Unicode 字符编码。同时小 endian (代码页 12000) 和 big endian (代码页 12001) 字节订单都受支持。此外可通过UTF32属性。

Encoding类主要用于不同的编码与 Unicode 之间转换。通常,派生的 Unicode 类之一是您的应用程序的正确选择。

使用GetEncoding方法来获取其他编码,并调用GetEncodings方法以获取所有编码的列表。

下表列出了.NET Framework 中受支持的编码。其中列出了每种编码的代码页编号以及的编码的值EncodingInfo.NameEncodingInfo.DisplayName属性。最后一列中的星号表示.NET Framework 中,而不考虑基础平台本身支持的代码页。请注意,代码页其EncodingInfo.Name属性对应于一种国际标准不一定是符合该标准填满中。

代码页

名称

显示名称

.NET framework 的支持

37

IBM037

IBM EBCDIC (美国加拿大)

 

437

IBM437

OEM 美国

 

500

IBM500

IBM EBCDIC (国际)

 

708

ASMO 708

阿拉伯语 (ASMO 708)

 

720

DOS 720

阿拉伯语 (DOS)

 

737

ibm737

希腊语 (DOS)

 

775

ibm775

波罗的语 (DOS)

 

850

ibm850

西欧语 (DOS)

 

852

ibm852

中欧语 (DOS)

 

855

IBM855

OEM 西里尔文

 

857

ibm857

土耳其语 (DOS)

 

858

IBM00858

OEM 多语言拉丁语我

 

860

IBM860

葡萄牙语 (DOS)

 

861

ibm861

冰岛语 (DOS)

 

862

DOS-862

希伯来语 (DOS)

 

863

IBM863

加拿大法语 (DOS)

 

864

IBM864

阿拉伯语 (864)

 

865

IBM865

北欧 (DOS)

 

866

cp866

西里尔语 (DOS)

 

869

ibm869

希腊语、 现代 (DOS)

 

870

IBM870

IBM EBCDIC (多语言拉丁语-2)

 

874

windows-874

泰语 (Windows)

 

875

cp875

IBM EBCDIC (希腊语现代)

 

932

shift_jis

日语 (SHIFT-JIS)

 

936

gb2312

简体中文 (GB2312)

949

ks_c_5601-1987

朝鲜语

 

950

big5

繁体中文 (Big5)

 

1026

IBM1026

IBM EBCDIC (土耳其语拉丁文-5)

 

1047

IBM01047

IBM 拉丁语 1

 

1140

IBM01140

IBM EBCDIC (美国加拿大欧元)

 

1141

IBM01141

IBM EBCDIC (德国欧元)

 

1142

IBM01142

IBM EBCDIC (丹麦挪威欧元)

 

1143

IBM01143

IBM EBCDIC (芬兰瑞典欧元)

 

1144

IBM01144

IBM EBCDIC (意大利欧元)

 

1145

IBM01145

IBM EBCDIC (西班牙欧元)

 

1146

IBM01146

IBM EBCDIC (英国欧元)

 

1147

IBM01147

IBM EBCDIC (法国欧元)

 

1148

IBM01148

IBM EBCDIC (国际欧元)

 

1149

IBM01149

IBM EBCDIC (冰岛语欧元)

 

1200

utf-16

Unicode

1201

unicodeFFFE

Unicode (big-endian)

1250

windows-1250

中欧语 (Windows)

 

1251

windows-1251

西里尔语 (Windows)

 

1252

Windows -1252

西欧语 (Windows)

1253

windows-1253

希腊语 (Windows)

 

1254

windows-1254

土耳其语 (Windows)

 

1255

windows-1255

希伯来语 (Windows)

 

1256

windows-1256

阿拉伯语 (Windows)

 

1257

windows-1257

波罗的语 (Windows)

 

1258

windows-1258

越南语 (Windows)

 

1361

韩文

朝鲜语 (韩文)

 

10000

macintosh

西欧语 (Mac)

 

10001

x mac 日语

日语 (Mac)

 

10002

x-mac chinesetrad

繁体中文 (Mac)

 

10003

朝鲜语 mac x-

朝鲜语 (Mac)

10004

x mac 阿拉伯

阿拉伯语 (Mac)

 

10005

希伯来语 mac x

希伯来语 (Mac)

 

10006

x-mac 希腊语

希腊语 (Mac)

 

10007

x-mac-西里尔语

西里尔语 (Mac)

 

10008

x-mac chinesesimp

简体中文 (Mac)

10010

罗马尼亚语 mac x-

罗马尼亚语 (Mac)

 

10017

x-mac-乌克兰语

乌克兰语 (Mac)

 

10021

x mac 泰语

泰语 (Mac)

 

10029

x-mac ce

中欧语 (Mac)

 

10079

冰岛语 mac x-

冰岛语 (Mac)

 

10081

x mac 土耳其语

土耳其语 (Mac)

 

10082

克罗地亚语 mac x-

克罗地亚语 (Mac)

 

12000

utf-32

Unicode (UTF-32)

12001

utf-32be

Unicode (utf-32 Big endian)

20000

x-中文 CNS

繁体中文 (CN)

 

20001

x cp20001

TCA 中国台湾地区

 

20002

x-中文 Eten

繁体中文 (Eten)

 

20003

x cp20003

IBM5550 中国台湾地区

 

20004

x cp20004

TeleText 中国台湾地区

 

20005

x cp20005

Wang 中国台湾地区

 

20105

x IA5

西欧语 (IA5)

 

20106

x IA5 德语

德语 (IA5)

 

20107

瑞典-语 IA5 x

瑞典语 (IA5)

 

20108

挪威语 IA5 x

挪威语 (IA5)

 

20127

我们 ascii

US ASCII

20261

x cp20261

T.61

 

20269

x cp20269

ISO -6937

 

20273

IBM273

IBM EBCDIC (德国)

 

20277

IBM277

IBM EBCDIC (丹麦挪威)

 

20278

IBM278

IBM EBCDIC (芬兰瑞典)

 

20280

IBM280

IBM EBCDIC (意大利)

 

20284

IBM284

IBM EBCDIC (西班牙)

 

20285

IBM285

IBM EBCDIC (适用于英国)

 

20290

IBM290

IBM EBCDIC (日语的片假名)

 

20297

IBM297

IBM EBCDIC (法国)

 

20420

IBM420

IBM EBCDIC (阿拉伯语)

 

20423

IBM423

IBM EBCDIC (希腊语)

 

20424

IBM424

IBM EBCDIC (希伯来语)

 

20833

x-EBCDIC KoreanExtended

IBM EBCDIC (扩展朝鲜语)

 

20838

IBM 泰语

IBM EBCDIC (泰语)

 

20866

koi8-r

西里尔语 (KOI8 R)

 

20871

IBM871

IBM EBCDIC (冰岛语)

 

20880

IBM880

IBM EBCDIC (西里尔文俄语)

 

20905

IBM905

IBM EBCDIC (土耳其语)

 

20924

IBM00924

IBM 拉丁语 1

 

20932

EUC-JP

日语 (JIS 0208 1990年和 0212年 1990年)

 

20936

x cp20936

简体中文 (GB2312-80)

20949

x cp20949

朝鲜语 Wansung

21025

cp1025

IBM EBCDIC (西里尔文塞尔维亚语-保加利亚语)

 

21866

koi8-u

西里尔语 (KOI8 U)

 

28591

iso 8859-1

西欧语 (ISO)

28592

iso 8859-2

中欧语 (ISO)

 

28593

iso 8859-3

拉丁文 3 (ISO)

 

28594

iso 8859-4

波罗的语 (ISO)

 

28595

iso 8859-5

西里尔语 (ISO)

 

28596

iso 8859-6

阿拉伯语 (ISO)

 

28597

iso 8859-7

希腊语 (ISO)

 

28598

iso 8859-8

希伯来语 (ISO Visual)

28599

iso 8859-9

土耳其语 (ISO)

 

28603

iso 8859-13

爱沙尼亚语 (ISO)

 

28605

iso 8859-15

拉丁文 9 (ISO)

 

29001

x 木

 

38598

iso 8859-8 i

希伯来语 (ISO 逻辑)

50220

iso 2022-jp

日语 (JIS)

50221

csISO2022JP

日语 (JIS 允许 1 字节假名)

50222

iso 2022-jp

日语 (JIS 允许 1 位字节假名-因此 / SI)

50225

iso-2022 kr

朝鲜语 (ISO)

50227

x cp50227

简体中文 (ISO 2022)

51932

euc jp

日语 (EUC)

51936

EUC CN

简体中文 (EUC)

51949

euc kr

朝鲜语 (EUC)

52936

hz gb-2312

简体中文 (HZ)

54936

GB18030 字符

简体中文 (GB18030)

57002

x-iscii de

ISCII 梵文

57003

x iscii 是

ISCII 孟加拉语

57004

x-iscii-ta

ISCII 泰米尔语)

57005

x-iscii te

ISCII 泰卢固语

57006

x-作为 iscii

ISCII 阿萨姆语

57007

x iscii 或

ISCII 奥里雅语

57008

x-iscii ka

ISCII 埃纳德语

57009

x-iscii ma

ISCII 马拉雅拉姆语

57010

x-iscii gu

ISCII 古吉拉特语

57011

x-iscii pa

ISCII 旁遮普语

65000

utf-7

Unicode (UTF-7)

65001

utf-8

Unicode (UTF-8)

MSDN Encoding  >>> https://msdn.microsoft.com/zh-cn/library/system.text.encoding%28v=vs.110%29.aspx