この記事では、この API のリファレンス ドキュメントに補足的な解説を提供します。
Encoding クラスは、文字エンコードを表します。
エンコードは、一連の Unicode 文字をバイト シーケンスに変換するプロセスです。 一方、デコードとは、エンコードされたバイトのシーケンスを一連の Unicode 文字に変換するプロセスです。 Encodingでサポートされている Unicode 変換形式 (UDF) およびその他のエンコードについては、「.NET での文字エンコード」を参照してください。
Encoding は、バイト配列などの任意のバイナリ データの代わりに Unicode 文字を操作することを目的としています。 任意のバイナリ データをテキストにエンコードする必要がある場合は、 Convert.ToBase64CharArrayなどのメソッドによって実装される uuencode などのプロトコルを使用する必要があります。
.NET には、現在の Unicode エンコードやその他のエンコードをサポートするために、 Encoding クラスの次の実装が用意されています。
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 文字をエンコードします。 リトル エンディアンとビッグ エンディアンの両方のバイトオーダーがサポートされています。 Unicode プロパティと BigEndianUnicode プロパティからも使用できます。
UTF32Encoding は UTF-32 エンコードを使用して Unicode 文字をエンコードします。 リトル エンディアン (コード ページ 12000) とビッグ エンディアン (コード ページ 12001) の両方のバイトオーダーがサポートされています。 UTF32 プロパティからも使用できます。
Encoding クラスは、主に異なるエンコーディングと Unicode の間で変換することを目的としています。 多くの場合、派生 Unicode クラスの 1 つが、アプリに適した選択肢です。
GetEncoding メソッドを使用して他のエンコーディングを取得し、GetEncodings メソッドを呼び出してすべてのエンコーディングの一覧を取得します。
エンコードの一覧
次の表に、.NET でサポートされるエンコードの一覧を示します。 各エンコードのコード ページ番号と、エンコードの EncodingInfo.Name プロパティと EncodingInfo.DisplayName プロパティの値が一覧表示されます。 .NET Framework サポート、.NET Core サポート、または .NET 5 以降のサポート列のチェック マークは、基になるプラットフォームに関係なく、その .NET 実装でコード ページがネイティブにサポートされていることを示します。 .NET Framework の場合、表に示されている他のエンコードの可用性は、オペレーティング システムによって異なります。 .NET Core および .NET 5 以降のバージョンでは、 System.Text.CodePagesEncodingProvider クラスを使用するか、 System.Text.EncodingProvider クラスから派生することによって、他のエンコードを使用できます。
注
EncodingInfo.Nameプロパティが国際標準に対応するコード ページは、必ずしもその標準に完全に準拠しているとは限りません。
コード ページ | 名前 | [表示名] | .NET Framework のサポート | .NET Core のサポート | .NET 5 以降のサポート |
---|---|---|---|---|---|
37 | IBM037 | IBM EBCDIC (US-Canada) | |||
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 (ギリシャ語モダン) | |||
9:32 | 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 (Germany-Euro) | |||
1142 | IBM01142 | IBM EBCDIC (デンマーク-Norway-Euro) | |||
1143 | IBM01143 | IBM EBCDIC (フィンランド-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 (ビッグ エンディアン) | ✓ | ✓ | ✓ |
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 | 韓国語 (Johab) | |||
1万 | マッキントッシュ | 西ヨーロッパ語 (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-croatian | クロアチア語 (Mac) | |||
12000 | utf-32 | Unicode (UTF-32) | ✓ | ✓ | ✓ |
12001 | utf-32BE | Unicode (UTF-32 ビッグ エンディアン) | ✓ | ✓ | ✓ |
20000 | x-Chinese-CNS | 繁体字中国語 (CNS) | |||
20001 | x-cp20001 | TCA 台湾 | |||
20002 | x-Chinese-Eten | 繁体字中国語 (Eten) | |||
20003 | x-cp20003 | 台湾IBM5550 | |||
20004 | x-cp20004 | TeleText Taiwan | |||
20005 | x-cp20005 | 王 台湾 | |||
20105 | x-IA5 | 西ヨーロッパ (IA5) | |||
20106 | x-IA5-German | ドイツ語 (IA5) | |||
20107 | x-IA5-Swedish | スウェーデン語 (IA5) | |||
20108 | x-IA5-Norwegian | ノルウェー語 (IA5) | |||
20127 | us-ascii | US-ASCII | ✓ | ✓ | ✓ |
20261 | x-cp20261 | T.61 | |||
20269 | x-cp20269 | ISO-6937 | |||
20273 | IBM273 | IBM EBCDIC (ドイツ) | |||
20277 | IBM277 | IBM EBCDIC (Denmark-Norway) | |||
20278 | IBM278 | IBM EBCDIC (Finland-Sweden) | |||
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 | 韓国語 Wansung | ✓ | ||
21025 | cp1025 | IBM EBCDIC (キリル Serbian-Bulgarian) | |||
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-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) | ✓ | ||
52,936 | hz-gb-2312 | 簡体字中国語 (HZ) | ✓ | ||
54936 | GB18030 | 簡体字中国語 (GB18030) | ✓ | ||
57002 | x-iscii-de | ISCII Devanagari | ✓ | ||
57003 | x-iscii-be | ISCII ベンガル語 | ✓ | ||
57004 | x-iscii-ta | ISCII Tamil | ✓ | ||
57005 | x-iscii-te | ISCII テルグ語 | ✓ | ||
57006 | x-iscii-as | ISCII Assamese | ✓ | ||
57007 | x-iscii-or | ISCII Oriya | ✓ | ||
57008 | x-iscii-ka | ISCII カンナダ | ✓ | ||
57009 | x-iscii-ma | ISCII マラヤーラム語 | ✓ | ||
57010 | x-iscii-gu | ISCII Gujarati | ✓ | ||
57011 | x-iscii-pa | ISCII Punjabi | ✓ | ||
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($"{enc.EncodingName} = Code Page {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
変換するデータが連続したブロックでのみ使用できる場合 (ストリームから読み取られるデータなど)、またはデータの量が非常に大きくて小さいブロックに分割する必要がある場合は、派生クラスの GetDecoder メソッドまたは GetEncoder メソッドによって提供されるDecoderまたはEncoderをそれぞれ使用する必要があります。
UTF-16 エンコーダーと UTF-32 エンコーダーは、ビッグ エンディアン バイトオーダー (最上位バイト優先) またはリトル エンディアン バイト順 (最下位バイト優先) を使用できます。 たとえば、ラテン大文字 A (U+0041) は次のようにシリアル化されます (16 進数)。
- UTF-16 ビッグ エンディアンバイトオーダー: 00 41
- UTF-16 リトル エンディアン バイト順: 41 00
- UTF-32 ビッグ エンディアン バイト順: 00 00 00 41
- UTF-32 リトル エンディアン バイト順: 41 00 00 00
一般に、ネイティブのバイト順を使用して Unicode 文字を格納する方が効率的です。 たとえば、Intel コンピューターなどのリトル エンディアン プラットフォームでは、リトル エンディアン バイト順を使用することをお勧めします。
GetPreamble メソッドは、バイト オーダー マーク (BOM) を含むバイト配列を取得します。 このバイト配列にエンコードされたストリームのプレフィックスが付いている場合は、デコーダーが使用するエンコード形式を識別するのに役立ちます。
バイト順とバイト順マークの詳細については、 Unicode ホーム ページの Unicode 標準を参照してください。
エンコード クラスでは、次のエラーが発生する可能性があることに注意してください。
- サイレントモードで "?" 文字に変更します。
- "best fit" 文字を使用します。
- U+FFFD Unicode 置換文字で EncoderFallback クラスと DecoderFallback クラスを使用して、アプリケーション固有の動作に変更します。
データ ストリーム エラーで例外をスローする必要があります。 アプリは、該当する場合は "throwonerror" フラグを使用するか、 EncoderExceptionFallback クラスと DecoderExceptionFallback クラスを使用します。 多くの場合、最適フォールバックは、データの損失や混乱を引き起こす可能性があり、単純な文字置換よりも遅いため、推奨されません。 ANSI エンコードの場合、最適な動作が既定値です。
.NET