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方法提供的GetDecoder或Encoder方法。
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”标志,要么使用 EncoderExceptionFallback 类 DecoderExceptionFallback 。 通常不建议最佳回退,因为它可能会导致数据丢失或混淆,并且比简单的字符替换速度慢。 对于 ANSI 编码,最佳拟合行为是默认值。