System.Text.Encoding class
This article provides supplementary remarks to the reference documentation for this API.
The Encoding class represents a character encoding.
Encoding is the process of transforming a set of Unicode characters into a sequence of bytes. In contrast, decoding is the process of transforming a sequence of encoded bytes into a set of Unicode characters. For information about the Unicode Transformation Formats (UTFs) and other encodings supported by Encoding, see Character Encoding in .NET.
Encoding is intended to operate on Unicode characters instead of arbitrary binary data, such as byte arrays. If you must encode arbitrary binary data into text, you should use a protocol such as uuencode, which is implemented by methods such as Convert.ToBase64CharArray.
.NET provides the following implementations of the Encoding class to support current Unicode encodings and other encodings:
ASCIIEncoding encodes Unicode characters as single 7-bit ASCII characters. This encoding only supports character values between U+0000 and U+007F. Code page 20127. Also available through the ASCII property.
UTF7Encoding encodes Unicode characters using the UTF-7 encoding. This encoding supports all Unicode character values. Code page 65000. Also available through the UTF7 property.
UTF8Encoding encodes Unicode characters using the UTF-8 encoding. This encoding supports all Unicode character values. Code page 65001. Also available through the UTF8 property.
UnicodeEncoding encodes Unicode characters using the UTF-16 encoding. Both little endian and big endian byte orders are supported. Also available through the Unicode property and the BigEndianUnicode property.
UTF32Encoding encodes Unicode characters using the UTF-32 encoding. Both little endian (code page 12000) and big endian (code page 12001) byte orders are supported. Also available through the UTF32 property.
The Encoding class is primarily intended to convert between different encodings and Unicode. Often one of the derived Unicode classes is the correct choice for your app.
Use the GetEncoding method to obtain other encodings, and call the GetEncodings method to get a list of all encodings.
List of encodings
The following table lists the encodings supported by .NET. It lists each encoding's code page number and the values of the encoding's EncodingInfo.Name and EncodingInfo.DisplayName properties. A check mark in the .NET Framework support, .NET Core support, or .NET 5 and later support column indicates that the code page is natively supported by that .NET implementation, regardless of the underlying platform. For .NET Framework, the availability of other encodings listed in the table depends on the operating system. For .NET Core and .NET 5 and later versions, other encodings are available by using the System.Text.CodePagesEncodingProvider class or by deriving from the System.Text.EncodingProvider class.
Note
Code pages whose EncodingInfo.Name property corresponds to an international standard do not necessarily comply in full with that standard.
Code page | Name | Display name | .NET Framework support | .NET Core support | .NET 5 and later support |
---|---|---|---|---|---|
37 | IBM037 | IBM EBCDIC (US-Canada) | |||
437 | IBM437 | OEM United States | |||
500 | IBM500 | IBM EBCDIC (International) | |||
708 | ASMO-708 | Arabic (ASMO 708) | |||
720 | DOS-720 | Arabic (DOS) | |||
737 | ibm737 | Greek (DOS) | |||
775 | ibm775 | Baltic (DOS) | |||
850 | ibm850 | Western European (DOS) | |||
852 | ibm852 | Central European (DOS) | |||
855 | IBM855 | OEM Cyrillic | |||
857 | ibm857 | Turkish (DOS) | |||
858 | IBM00858 | OEM Multilingual Latin I | |||
860 | IBM860 | Portuguese (DOS) | |||
861 | ibm861 | Icelandic (DOS) | |||
862 | DOS-862 | Hebrew (DOS) | |||
863 | IBM863 | French Canadian (DOS) | |||
864 | IBM864 | Arabic (864) | |||
865 | IBM865 | Nordic (DOS) | |||
866 | cp866 | Cyrillic (DOS) | |||
869 | ibm869 | Greek, Modern (DOS) | |||
870 | IBM870 | IBM EBCDIC (Multilingual Latin-2) | |||
874 | windows-874 | Thai (Windows) | |||
875 | cp875 | IBM EBCDIC (Greek Modern) | |||
932 | shift_jis | Japanese (Shift-JIS) | |||
936 | gb2312 | Chinese Simplified (GB2312) | ✓ | ||
949 | ks_c_5601-1987 | Korean | |||
950 | big5 | Chinese Traditional (Big5) | |||
1026 | IBM1026 | IBM EBCDIC (Turkish Latin-5) | |||
1047 | IBM01047 | IBM Latin-1 | |||
1140 | IBM01140 | IBM EBCDIC (US-Canada-Euro) | |||
1141 | IBM01141 | IBM EBCDIC (Germany-Euro) | |||
1142 | IBM01142 | IBM EBCDIC (Denmark-Norway-Euro) | |||
1143 | IBM01143 | IBM EBCDIC (Finland-Sweden-Euro) | |||
1144 | IBM01144 | IBM EBCDIC (Italy-Euro) | |||
1145 | IBM01145 | IBM EBCDIC (Spain-Euro) | |||
1146 | IBM01146 | IBM EBCDIC (UK-Euro) | |||
1147 | IBM01147 | IBM EBCDIC (France-Euro) | |||
1148 | IBM01148 | IBM EBCDIC (International-Euro) | |||
1149 | IBM01149 | IBM EBCDIC (Icelandic-Euro) | |||
1200 | utf-16 | Unicode | ✓ | ✓ | ✓ |
1201 | unicodeFFFE | Unicode (Big endian) | ✓ | ✓ | ✓ |
1250 | windows-1250 | Central European (Windows) | |||
1251 | windows-1251 | Cyrillic (Windows) | |||
1252 | Windows-1252 | Western European (Windows) | ✓ | ||
1253 | windows-1253 | Greek (Windows) | |||
1254 | windows-1254 | Turkish (Windows) | |||
1255 | windows-1255 | Hebrew (Windows) | |||
1256 | windows-1256 | Arabic (Windows) | |||
1257 | windows-1257 | Baltic (Windows) | |||
1258 | windows-1258 | Vietnamese (Windows) | |||
1361 | Johab | Korean (Johab) | |||
10000 | macintosh | Western European (Mac) | |||
10001 | x-mac-japanese | Japanese (Mac) | |||
10002 | x-mac-chinesetrad | Chinese Traditional (Mac) | |||
10003 | x-mac-korean | Korean (Mac) | ✓ | ||
10004 | x-mac-arabic | Arabic (Mac) | |||
10005 | x-mac-hebrew | Hebrew (Mac) | |||
10006 | x-mac-greek | Greek (Mac) | |||
10007 | x-mac-cyrillic | Cyrillic (Mac) | |||
10008 | x-mac-chinesesimp | Chinese Simplified (Mac) | ✓ | ||
10010 | x-mac-romanian | Romanian (Mac) | |||
10017 | x-mac-ukrainian | Ukrainian (Mac) | |||
10021 | x-mac-thai | Thai (Mac) | |||
10029 | x-mac-ce | Central European (Mac) | |||
10079 | x-mac-icelandic | Icelandic (Mac) | |||
10081 | x-mac-turkish | Turkish (Mac) | |||
10082 | x-mac-croatian | Croatian (Mac) | |||
12000 | utf-32 | Unicode (UTF-32) | ✓ | ✓ | ✓ |
12001 | utf-32BE | Unicode (UTF-32 Big endian) | ✓ | ✓ | ✓ |
20000 | x-Chinese-CNS | Chinese Traditional (CNS) | |||
20001 | x-cp20001 | TCA Taiwan | |||
20002 | x-Chinese-Eten | Chinese Traditional (Eten) | |||
20003 | x-cp20003 | IBM5550 Taiwan | |||
20004 | x-cp20004 | TeleText Taiwan | |||
20005 | x-cp20005 | Wang Taiwan | |||
20105 | x-IA5 | Western European (IA5) | |||
20106 | x-IA5-German | German (IA5) | |||
20107 | x-IA5-Swedish | Swedish (IA5) | |||
20108 | x-IA5-Norwegian | Norwegian (IA5) | |||
20127 | us-ascii | US-ASCII | ✓ | ✓ | ✓ |
20261 | x-cp20261 | T.61 | |||
20269 | x-cp20269 | ISO-6937 | |||
20273 | IBM273 | IBM EBCDIC (Germany) | |||
20277 | IBM277 | IBM EBCDIC (Denmark-Norway) | |||
20278 | IBM278 | IBM EBCDIC (Finland-Sweden) | |||
20280 | IBM280 | IBM EBCDIC (Italy) | |||
20284 | IBM284 | IBM EBCDIC (Spain) | |||
20285 | IBM285 | IBM EBCDIC (UK) | |||
20290 | IBM290 | IBM EBCDIC (Japanese katakana) | |||
20297 | IBM297 | IBM EBCDIC (France) | |||
20420 | IBM420 | IBM EBCDIC (Arabic) | |||
20423 | IBM423 | IBM EBCDIC (Greek) | |||
20424 | IBM424 | IBM EBCDIC (Hebrew) | |||
20833 | x-EBCDIC-KoreanExtended | IBM EBCDIC (Korean Extended) | |||
20838 | IBM-Thai | IBM EBCDIC (Thai) | |||
20866 | koi8-r | Cyrillic (KOI8-R) | |||
20871 | IBM871 | IBM EBCDIC (Icelandic) | |||
20880 | IBM880 | IBM EBCDIC (Cyrillic Russian) | |||
20905 | IBM905 | IBM EBCDIC (Turkish) | |||
20924 | IBM00924 | IBM Latin-1 | |||
20932 | EUC-JP | Japanese (JIS 0208-1990 and 0212-1990) | |||
20936 | x-cp20936 | Chinese Simplified (GB2312-80) | ✓ | ||
20949 | x-cp20949 | Korean Wansung | ✓ | ||
21025 | cp1025 | IBM EBCDIC (Cyrillic Serbian-Bulgarian) | |||
21866 | koi8-u | Cyrillic (KOI8-U) | |||
28591 | iso-8859-1 | Western European (ISO) | ✓ | ✓ | ✓ |
28592 | iso-8859-2 | Central European (ISO) | |||
28593 | iso-8859-3 | Latin 3 (ISO) | |||
28594 | iso-8859-4 | Baltic (ISO) | |||
28595 | iso-8859-5 | Cyrillic (ISO) | |||
28596 | iso-8859-6 | Arabic (ISO) | |||
28597 | iso-8859-7 | Greek (ISO) | |||
28598 | iso-8859-8 | Hebrew (ISO-Visual) | ✓ | ||
28599 | iso-8859-9 | Turkish (ISO) | |||
28603 | iso-8859-13 | Estonian (ISO) | |||
28605 | iso-8859-15 | Latin 9 (ISO) | |||
29001 | x-Europa | Europa | |||
38598 | iso-8859-8-i | Hebrew (ISO-Logical) | ✓ | ||
50220 | iso-2022-jp | Japanese (JIS) | ✓ | ||
50221 | csISO2022JP | Japanese (JIS-Allow 1 byte Kana) | ✓ | ||
50222 | iso-2022-jp | Japanese (JIS-Allow 1 byte Kana - SO/SI) | ✓ | ||
50225 | iso-2022-kr | Korean (ISO) | ✓ | ||
50227 | x-cp50227 | Chinese Simplified (ISO-2022) | ✓ | ||
51932 | euc-jp | Japanese (EUC) | ✓ | ||
51936 | EUC-CN | Chinese Simplified (EUC) | ✓ | ||
51949 | euc-kr | Korean (EUC) | ✓ | ||
52936 | hz-gb-2312 | Chinese Simplified (HZ) | ✓ | ||
54936 | GB18030 | Chinese Simplified (GB18030) | ✓ | ||
57002 | x-iscii-de | ISCII Devanagari | ✓ | ||
57003 | x-iscii-be | ISCII Bengali | ✓ | ||
57004 | x-iscii-ta | ISCII Tamil | ✓ | ||
57005 | x-iscii-te | ISCII Telugu | ✓ | ||
57006 | x-iscii-as | ISCII Assamese | ✓ | ||
57007 | x-iscii-or | ISCII Oriya | ✓ | ||
57008 | x-iscii-ka | ISCII Kannada | ✓ | ||
57009 | x-iscii-ma | ISCII Malayalam | ✓ | ||
57010 | x-iscii-gu | ISCII Gujarati | ✓ | ||
57011 | x-iscii-pa | ISCII Punjabi | ✓ | ||
65000 | utf-7 | Unicode (UTF-7) | ✓ | ✓ | |
65001 | utf-8 | Unicode (UTF-8) | ✓ | ✓ | ✓ |
The following example calls the GetEncoding(Int32) and GetEncoding(String) methods to get the Greek (Windows) code page encoding. It compares the Encoding objects returned by the method calls to show that they are equal, and then maps displays the Unicode code point and the corresponding code page value for each character in the Greek alphabet.
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
If the data to be converted is available only in sequential blocks (such as data read from a stream) or if the amount of data is so large that it needs to be divided into smaller blocks, you should use the Decoder or the Encoder provided by the GetDecoder method or the GetEncoder method, respectively, of a derived class.
The UTF-16 and the UTF-32 encoders can use the big endian byte order (most significant byte first) or the little endian byte order (least significant byte first). For example, the Latin Capital Letter A (U+0041) is serialized as follows (in hexadecimal):
- UTF-16 big endian byte order: 00 41
- UTF-16 little endian byte order: 41 00
- UTF-32 big endian byte order: 00 00 00 41
- UTF-32 little endian byte order: 41 00 00 00
It is generally more efficient to store Unicode characters using the native byte order. For example, it is better to use the little endian byte order on little endian platforms, such as Intel computers.
The GetPreamble method retrieves an array of bytes that includes the byte order mark (BOM). If this byte array is prefixed to an encoded stream, it helps the decoder to identify the encoding format used.
For more information on byte order and the byte order mark, see The Unicode Standard at the Unicode home page.
Note that the encoding classes allow errors to:
- Silently change to a "?" character.
- Use a "best fit" character.
- Change to an application-specific behavior through use of the EncoderFallback and DecoderFallback classes with the U+FFFD Unicode replacement character.
You should throw an exception on any data stream error. An app either uses a "throwonerror" flag when applicable or uses the EncoderExceptionFallback and DecoderExceptionFallback classes. Best fit fallback is often not recommended because it can cause data loss or confusion and is slower than simple character replacements. For ANSI encodings, the best fit behavior is the default.