System.Text.Encoding 类

本文提供了此 API 参考文档的补充说明。

Encoding 类表示字符编码。

编码是将一组 Unicode 字符转换为一个字节序列的过程。 相比之下,解码是将编码字节序列转换为一组 Unicode 字符的过程。 有关 Unicode 转换格式(UTF)和其他受支持 Encoding编码的信息,请参阅 .NET 中的字符编码。

Encoding 旨在对 Unicode 字符而不是任意二进制数据(如字节数组)进行操作。 如果必须将任意二进制数据编码为文本,则应使用由方法(如 Convert.ToBase64CharArrayuuencode)实现的协议。

.NET 提供类的 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)和大型 endian(代码页 12001)字节订单。 还可以通过 UTF32 属性使用。

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

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

编码列表

下表列出了 .NET 支持的编码。 它列出每个编码的代码页码以及编码EncodingInfo.NameEncodingInfo.DisplayName的属性的值。 .NET Framework 支持、.NET Core 支持.NET 5 及更高版本的支持列中的检查标记指示无论基础平台如何,该 .NET 实现都以本机方式支持代码页。 对于 .NET Framework,表中列出的其他编码的可用性取决于操作系统。 对于 .NET Core 和 .NET 5 及更高版本,可以使用该类或从System.Text.EncodingProvider类派生来获取其他编码System.Text.CodePagesEncodingProvider

注意

EncodingInfo.Name 属性对应于国际标准的代码页不一定完全符合该标准。

代码页 名称 显示名称 .NET Framework 支持 .NET Core 支持 .NET 5 及更高版本支持
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 多语言拉丁语 I
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 Latin-1
1140 IBM01140 IBM EBCDIC (US-Canada-Euro)
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 (大尾语)
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 Johab 韩国语(乔哈布)
10000 Macintosh 西欧(Mac)
10001 x-mac-japanese 日语(Mac)
10002 x-mac-chinesetrad 中国传统(Mac)
10003 x-mac-korean 韩国语(Mac)
10004 x-mac-arabic 阿拉伯语(Mac)
10005 x-mac-希伯来语 希伯来语(Mac)
10006 x-mac-greek 希腊文 (Mac)
10007 x-mac-cyrillic 西里尔文 (Mac)
10008 x-mac-chinesesimp 简体中文(Mac)
10010 x-mac-罗马尼亚语 罗马尼亚语(Mac)
10017 x-mac-乌克兰语 乌克兰语(Mac)
10021 x-mac-thai 泰国语(Mac)
10029 x-mac-ce 中欧(Mac)
10079 x-mac-icelandic 冰岛语(Mac)
10081 x-mac-turkish 土耳其 (Mac)
10082 x-mac-克罗地亚 克罗地亚语 (Mac)
12000 utf-32 Unicode (UTF-32)
12001 utf-32BE Unicode (UTF-32 Big endian)
20000 x-Chinese-CNS 中国传统(CNS)
20001 x-cp20001 TCA 台湾
20002 x-Chinese-Eten 中国传统(Eten)
20003 x-cp20003 IBM5550台湾
20004 x-cp20004 TeleText 台湾
20005 x-cp20005 王台
20105 x-IA5 西欧(IA5)
20106 x-IA5-德语 德语(IA5)
20107 x-IA5-Swedish 瑞典语 (IA5)
20108 x-IA5-挪威语 挪威语(IA5)
20127 us-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-Thai IBM EBCDIC (泰国)
20866 koi8-r 西里尔文 (KOI8-R)
20871 IBM871 IBM EBCDIC (冰岛语)
20880 IBM880 IBM EBCDIC (西里尔文俄语)
20905 IBM905 IBM EBCDIC (土耳其)
20924 IBM00924 IBM Latin-1
20932 EUC-JP 日语 (JIS 0208-1990 和 0212-1990)
20936 x-cp20936 简体中文(GB2312-80)
20949 x-cp20949 韩国万松
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-Europa 欧洲
38598 iso-8859-8-i 希伯来语 (ISO-Logical)
50220 iso-2022-jp 日语(JIS)
50221 csISO2022JP 日语 (JIS-Allow 1 字节假名)
50222 iso-2022-jp 日语 (JIS-Allow 1 字节假名 - SO/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 Devanagari
57003 x-iscii-be ISCII Bengali
57004 x-iscii-ta ISCII 泰米尔语
57005 x-iscii-te ISCII 泰卢固语
57006 x-iscii-as ISCII Assamese
57007 x-iscii-or ISCII Oriya
57008 x-iscii-ka ISCII Kannada
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)

以下示例调用 GetEncoding(Int32)GetEncoding(String) 方法以获取希腊语(Windows)代码页编码。 它将方法调用返回的对象进行比较 Encoding ,以显示它们相等,然后映射显示 Unicode 代码点以及希腊字母表中每个字符的相应代码页值。

using System;
using System.Text;

public class Example
{
   public static void Main()
   {
      Encoding enc = Encoding.GetEncoding(1253);
      Encoding altEnc = Encoding.GetEncoding("windows-1253");
      Console.WriteLine("{0} = Code Page {1}: {2}", enc.EncodingName,
                        altEnc.CodePage, enc.Equals(altEnc));
      string greekAlphabet = "Α α Β β Γ γ Δ δ Ε ε Ζ ζ Η η " +
                             "Θ θ Ι ι Κ κ Λ λ Μ μ Ν ν Ξ ξ " +
                             "Ο ο Π π Ρ ρ Σ σ ς Τ τ Υ υ " +
                             "Φ φ Χ χ Ψ ψ Ω ω";
      Console.OutputEncoding = Encoding.UTF8;
      byte[] bytes = enc.GetBytes(greekAlphabet);
      Console.WriteLine("{0,-12} {1,20} {2,20:X2}", "Character",
                        "Unicode Code Point", "Code Page 1253");
      for (int ctr = 0; ctr < bytes.Length; ctr++) {
         if (greekAlphabet[ctr].Equals(' '))
            continue;

         Console.WriteLine("{0,-12} {1,20} {2,20:X2}", greekAlphabet[ctr],
                           GetCodePoint(greekAlphabet[ctr]), bytes[ctr]);
      }
   }

   private static string GetCodePoint(char ch)
   {
      string retVal = "u+";
      byte[] bytes = Encoding.Unicode.GetBytes(ch.ToString());
      for (int ctr = bytes.Length - 1; ctr >= 0; ctr--)
         retVal += bytes[ctr].ToString("X2");

      return retVal;
   }
}
// The example displays the following output:
//       Character      Unicode Code Point       Code Page 1253
//       Α                          u+0391                   C1
//       α                          u+03B1                   E1
//       Β                          u+0392                   C2
//       β                          u+03B2                   E2
//       Γ                          u+0393                   C3
//       γ                          u+03B3                   E3
//       Δ                          u+0394                   C4
//       δ                          u+03B4                   E4
//       Ε                          u+0395                   C5
//       ε                          u+03B5                   E5
//       Ζ                          u+0396                   C6
//       ζ                          u+03B6                   E6
//       Η                          u+0397                   C7
//       η                          u+03B7                   E7
//       Θ                          u+0398                   C8
//       θ                          u+03B8                   E8
//       Ι                          u+0399                   C9
//       ι                          u+03B9                   E9
//       Κ                          u+039A                   CA
//       κ                          u+03BA                   EA
//       Λ                          u+039B                   CB
//       λ                          u+03BB                   EB
//       Μ                          u+039C                   CC
//       μ                          u+03BC                   EC
//       Ν                          u+039D                   CD
//       ν                          u+03BD                   ED
//       Ξ                          u+039E                   CE
//       ξ                          u+03BE                   EE
//       Ο                          u+039F                   CF
//       ο                          u+03BF                   EF
//       Π                          u+03A0                   D0
//       π                          u+03C0                   F0
//       Ρ                          u+03A1                   D1
//       ρ                          u+03C1                   F1
//       Σ                          u+03A3                   D3
//       σ                          u+03C3                   F3
//       ς                          u+03C2                   F2
//       Τ                          u+03A4                   D4
//       τ                          u+03C4                   F4
//       Υ                          u+03A5                   D5
//       υ                          u+03C5                   F5
//       Φ                          u+03A6                   D6
//       φ                          u+03C6                   F6
//       Χ                          u+03A7                   D7
//       χ                          u+03C7                   F7
//       Ψ                          u+03A8                   D8
//       ψ                          u+03C8                   F8
//       Ω                          u+03A9                   D9
//       ω                          u+03C9                   F9
Imports System.Text

Module Example
   Public Sub Main()
      Dim enc As Encoding = Encoding.GetEncoding(1253)
      Dim altEnc As Encoding = Encoding.GetEncoding("windows-1253")
      Console.WriteLine("{0} = Code Page {1}: {2}", enc.EncodingName,
                        altEnc.CodePage, enc.Equals(altEnc))
      Dim greekAlphabet As String = "Α α Β β Γ γ Δ δ Ε ε Ζ ζ Η η " +
                                    "Θ θ Ι ι Κ κ Λ λ Μ μ Ν ν Ξ ξ " +
                                    "Ο ο Π π Ρ ρ Σ σ ς Τ τ Υ υ " +
                                    "Φ φ Χ χ Ψ ψ Ω ω"
      Console.OutputEncoding = Encoding.UTF8
      Dim bytes() As Byte = enc.GetBytes(greekAlphabet)
      Console.WriteLine("{0,-12} {1,20} {2,20:X2}", "Character",
                        "Unicode Code Point", "Code Page 1253")
      For ctr As Integer = 0 To bytes.Length - 1
         If greekAlphabet(ctr).Equals(" "c) Then Continue For

         Console.WriteLine("{0,-12} {1,20} {2,20:X2}", greekAlphabet(ctr),
                           GetCodePoint(greekAlphabet(ctr)), bytes(ctr))
      Next

   End Sub
   
   Private Function GetCodePoint(ch As String) As String
      Dim retVal As String = "u+"
      Dim bytes() As Byte = Encoding.Unicode.GetBytes(ch)
      For ctr As Integer = bytes.Length - 1 To 0 Step -1
         retVal += bytes(ctr).ToString("X2")
      Next
      Return retVal
   End Function
End Module
' The example displays the following output:
'    Character      Unicode Code Point       Code Page 1253
'    Α                          u+0391                   C1
'    α                          u+03B1                   E1
'    Β                          u+0392                   C2
'    β                          u+03B2                   E2
'    Γ                          u+0393                   C3
'    γ                          u+03B3                   E3
'    Δ                          u+0394                   C4
'    δ                          u+03B4                   E4
'    Ε                          u+0395                   C5
'    ε                          u+03B5                   E5
'    Ζ                          u+0396                   C6
'    ζ                          u+03B6                   E6
'    Η                          u+0397                   C7
'    η                          u+03B7                   E7
'    Θ                          u+0398                   C8
'    θ                          u+03B8                   E8
'    Ι                          u+0399                   C9
'    ι                          u+03B9                   E9
'    Κ                          u+039A                   CA
'    κ                          u+03BA                   EA
'    Λ                          u+039B                   CB
'    λ                          u+03BB                   EB
'    Μ                          u+039C                   CC
'    μ                          u+03BC                   EC
'    Ν                          u+039D                   CD
'    ν                          u+03BD                   ED
'    Ξ                          u+039E                   CE
'    ξ                          u+03BE                   EE
'    Ο                          u+039F                   CF
'    ο                          u+03BF                   EF
'    Π                          u+03A0                   D0
'    π                          u+03C0                   F0
'    Ρ                          u+03A1                   D1
'    ρ                          u+03C1                   F1
'    Σ                          u+03A3                   D3
'    σ                          u+03C3                   F3
'    ς                          u+03C2                   F2
'    Τ                          u+03A4                   D4
'    τ                          u+03C4                   F4
'    Υ                          u+03A5                   D5
'    υ                          u+03C5                   F5
'    Φ                          u+03A6                   D6
'    φ                          u+03C6                   F6
'    Χ                          u+03A7                   D7
'    χ                          u+03C7                   F7
'    Ψ                          u+03A8                   D8
'    ψ                          u+03C8                   F8
'    Ω                          u+03A9                   D9
'    ω                          u+03C9                   F9

如果要转换的数据仅在顺序块(如从流中读取的数据)中可用,或者如果数据量如此之大且需要将其划分为较小的块,则应分别使用Decoder派生类的方法或GetEncoder方法提供的GetDecoderEncoder方法。

UTF-16 和 UTF-32 编码器可以使用大字节字节顺序(最重要字节优先)或小字节字节顺序(最不重要的字节优先)。 例如,拉丁文大写字母 A (U+0041) 按如下所示序列化(十六进制):

  • UTF-16 大尾字节顺序:00 41
  • UTF-16 小尾字节顺序:41 00
  • UTF-32 big endian 字节顺序:00 00 00 41
  • UTF-32 小尾字节顺序:41 00 00 00

使用本机字节顺序存储 Unicode 字符通常更高效。 例如,最好在小端平台(如 Intel 计算机)上使用小字节字节顺序。

该方法 GetPreamble 检索包含字节顺序标记(BOM)的字节数组。 如果此字节数组以编码的流为前缀,则它有助于解码器标识所使用的编码格式。

有关字节顺序和字节顺序标记的详细信息,请参阅 Unicode 主页上的 Unicode 标准版。

请注意,编码类允许以下错误:

  • 以无提示方式更改为“?” 字符。
  • 使用“最适合”字符。
  • 通过使用 EncoderFallback U+FFFD Unicode 替换字符和 DecoderFallback 类,更改为特定于应用程序的行为。

应对任何数据流错误引发异常。 如果适用,应用要么使用“throwonerror”标志,要么使用 EncoderExceptionFallbackDecoderExceptionFallback 。 通常不建议最佳回退,因为它可能会导致数据丢失或混淆,并且比简单的字符替换速度慢。 对于 ANSI 编码,最佳拟合行为是默认值。