在网络通信中,很多情况下都是将字符信息转成字节序列进行传输。将字符序列转为字节序列的过程称为编码。当这些字节传送到接收方,接收方需要逆向将字节序列转为字符序列。这个过程就是解码。
常见编码有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之间进行转换。也就是我们本篇主角。
//获得所有编码名称和其描述信息;
foreach (EncodingInfo encodingInfo in Encoding.GetEncodings())
{
Debug.Log(encodingInfo.Name+"///"+encodingInfo.GetEncoding().EncodingName);
}
//output: 95种字符集。
//获取某个指定的编码集;
Encoding gb2312 = Encoding.GetEncoding("GB2312");
Encoding ascii = Encoding.ASCII;
Encoding utf8 = Encoding.GetEncoding("UTF-8");
Debug.Log("headName::" + gb2312.HeaderName + "///" + gb2312.EncodingName);
Debug.Log("headName::" + ascii.HeaderName + "///" + ascii.EncodingName);
Debug.Log("headName::" + utf8.HeaderName + "///" + utf8.EncodingName);
//不同编码之间转换;
string str = "这个字符集是什么鬼?Pi(\u03a0)";
Encoding unicode = Encoding.Unicode;
Encoding utf_8 = Encoding.GetEncoding("UTF-8");
byte[] unicodeBytes = unicode.GetBytes(str);
byte[] utf8Bytes = Encoding.Convert(unicode, utf_8, unicodeBytes);
string value = utf_8.GetString(utf8Bytes);
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.Name和EncodingInfo.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