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