DecoderExceptionFallback クラス
アセンブリ: mscorlib (mscorlib.dll 内)

<SerializableAttribute> _ Public NotInheritable Class DecoderExceptionFallback Inherits DecoderFallback

エンコーディングでは、Unicode 文字をエンコード済みバイト シーケンスにマップします。エンコード済みバイト シーケンスは、ディスクなどの物理メディアに転送したり、通信リンクを通じて転送したりできます。文字はさまざまな方法でマップできますが、特定のエンコーディングは Encoding クラスから派生した型で表されます。具体的には、エンコーディングの型の GetBytes メソッドは文字をバイト シーケンスにエンコードし、GetChars メソッドはバイト シーケンスを文字にデコードします。
しかし、入力バイト シーケンスがエンコーディングによってマップできない場合、デコード処理は失敗する可能性があります。たとえば、ASCIIEncoding オブジェクトは、コード ポイント値が U+0000 から U+007F の範囲外にある文字のバイト シーケンスをデコードできません。
エンコーディングまたはデコードによる変換が実行できない場合のために、.NET Framework では、フォールバックと呼ばれるエラー処理機構が用意されています。コードでは、定義済みの .NET Framework のデコーダ フォールバックを使用するか、DecoderFallback クラスと DecoderFallbackBuffer クラスから継承したカスタムのデコーダ フォールバックを作成できます。
.NET Framework では、デコード変換エラーを処理するため、異なるフォールバック方法を実装する 2 つの定義済みクラスが用意されています。DecoderReplacementFallback クラスは、変換できない入力バイト シーケンスの代わりに、指定した文字列を挿入します。代替文字列の作成後、デコード処理は、残りの入力の変換を引き続き実行します。一方、DecoderExceptionFallback クラスは、無効なバイト シーケンスを検出すると、DecoderFallbackException をスローします。

DecoderExceptionFallback クラスと DecoderFallbackException クラスのコード例を次に示します。
' This example demonstrates the DecoderExceptionFallback class. Imports System Imports System.Text Class Sample Public Shared Sub Main() ' Create an encoding, which is equivalent to calling the ' ASCIIEncoding class constructor. ' The DecoderExceptionFallback parameter specifies that an exception ' is thrown if a character cannot be encoded. ' An encoder exception fallback is also specified, but in this code ' example the encoding operation cannot fail. Dim eef As New EncoderExceptionFallback() Dim def As New DecoderExceptionFallback() Dim ae As Encoding = Encoding.GetEncoding("us-ascii", eef, def) Dim inputString As String = "XYZ" Dim decodedString As String Dim twoNewLines As String = vbCrLf & vbCrLf Dim numberOfEncodedBytes As Integer = ae.GetByteCount(inputString) ' Counteract the compiler adding an extra element. Dim encodedBytes(numberOfEncodedBytes - 1) As Byte ' -------------------------------------------------------------------------- Console.Clear() ' Display the name of the encoding. Console.WriteLine("The name of the encoding is ""{0}""." & vbCrLf, ae.WebName) ' Display the input string in text. Console.WriteLine("Input string ({0} characters): ""{1}""", inputString.Length, inputString) ' Display the input string in hexadecimal. ' Each element is converted to an integer with Convert.ToInt32. Console.Write("Input string in hexadecimal: ") Dim c As Char For Each c In inputString.ToCharArray() Console.Write("0x{0:X2} ", Convert.ToInt32(c)) Next c Console.Write(twoNewLines) ' -------------------------------------------------------------------------- ' Encode the input string. Console.WriteLine("Encode the input string...") numberOfEncodedBytes = ae.GetBytes(inputString, 0, inputString.Length, _ encodedBytes, 0) ' Display the encoded bytes. ' Each element is converted to an integer with Convert.ToInt32. Console.WriteLine("Encoded bytes in hexadecimal ({0} bytes):" & vbCrLf, _ numberOfEncodedBytes) Dim b As Byte For Each b In encodedBytes Console.Write("0x{0:X2} ", Convert.ToInt32(b)) Next b Console.Write(twoNewLines) ' -------------------------------------------------------------------------- ' Replace the encoded byte sequences for the characters 'X' and 'Z' with the ' value 0xFF, which is outside the valid range of 0x00 to 0x7F for ' ASCIIEncoding. The resulting byte sequence is actually the beginning of ' this code example because it is the input to the decoder operation, and ' is equivalent to a corrupted or improperly encoded byte sequence. encodedBytes(0) = &HFF encodedBytes(2) = &HFF Console.WriteLine("Display the corrupted byte sequence...") ' Each element is converted to an integer with Convert.ToInt32. Console.WriteLine("Encoded bytes in hexadecimal ({0} bytes):" & vbCrLf, _ numberOfEncodedBytes) For Each b In encodedBytes Console.Write("0x{0:X2} ", Convert.ToInt32(b)) Next b Console.Write(twoNewLines) ' -------------------------------------------------------------------------- ' Attempt to decode the encoded bytes. However, an exception is thrown ' before the byte sequence can be decoded. Console.WriteLine("Compare the decoded bytes to the input string...") Try decodedString = ae.GetString(encodedBytes) Catch dfe As DecoderFallbackException Console.WriteLine(dfe) Console.WriteLine(vbCrLf & _ "*** THE CODE EXAMPLE TERMINATES HERE AS INTENDED. ***") Return End Try ' This statement is never executed. Console.WriteLine("This statement is never executed.") End Sub 'Main End Class 'Sample ' 'This code example produces the following results: ' 'The name of the encoding is "us-ascii". ' 'Input string (3 characters): "XYZ" 'Input string in hexadecimal: 0x58 0x59 0x5A ' 'Encode the input string... 'Encoded bytes in hexadecimal (3 bytes): ' '0x58 0x59 0x5A ' 'Display the corrupted byte sequence... 'Encoded bytes in hexadecimal (3 bytes): ' '0xFF 0x59 0xFF ' 'Compare the decoded bytes to the input string... 'System.Text.DecoderFallbackException: Unable to translate bytes [FF] at index 0 from speci 'fied code page to Unicode. ' at System.Text.DecoderExceptionFallbackBuffer.Throw(Byte[] bytesUnknown, Int32 index) ' at System.Text.DecoderExceptionFallbackBuffer.Fallback(Byte[] bytesUnknown, Int32 index ') ' at System.Text.DecoderFallbackBuffer.InternalFallback(Byte[] bytes, Byte* pBytes) ' at System.Text.ASCIIEncoding.GetCharCount(Byte* bytes, Int32 count, DecoderNLS decoder) ' ' at System.String.CreateStringFromEncoding(Byte* bytes, Int32 byteLength, Encoding encod 'ing) ' at System.Text.ASCIIEncoding.GetString(Byte[] bytes, Int32 byteIndex, Int32 byteCount) ' at System.Text.Encoding.GetString(Byte[] bytes) ' at Sample.Main() ' '*** THE CODE EXAMPLE TERMINATES HERE AS INTENDED. *** ' '
// This example demonstrates the DecoderExceptionFallback class. using System; using System.Text; class Sample { public static void Main() { // Create an encoding, which is equivalent to calling the // ASCIIEncoding class constructor. // The DecoderExceptionFallback parameter specifies that an exception // is thrown if a character cannot be encoded. // An encoder exception fallback is also specified, but in this code // example the encoding operation cannot fail. Encoding ae = Encoding.GetEncoding( "us-ascii", new EncoderExceptionFallback(), new DecoderExceptionFallback()); string inputString = "XYZ"; string decodedString; string twoNewLines = "\n\n"; byte[] encodedBytes = new byte[ae.GetByteCount(inputString)]; int numberOfEncodedBytes = 0; // -------------------------------------------------------------------------- Console.Clear(); // Display the name of the encoding. Console.WriteLine("The name of the encoding is \"{0}\".\n", ae.WebName); // Display the input string in text. Console.WriteLine("Input string ({0} characters): \"{1}\"", inputString.Length, inputString); // Display the input string in hexadecimal. Console.Write("Input string in hexadecimal: "); foreach (char c in inputString.ToCharArray()) { Console.Write("0x{0:X2} ", (int)c); } Console.Write(twoNewLines); // -------------------------------------------------------------------------- // Encode the input string. Console.WriteLine("Encode the input string..."); numberOfEncodedBytes = ae.GetBytes(inputString, 0, inputString.Length, encodedBytes, 0); // Display the encoded bytes. Console.WriteLine("Encoded bytes in hexadecimal ({0} bytes):\n", numberOfEncodedBytes); foreach (byte b in encodedBytes) { Console.Write("0x{0:X2} ", (int)b); } Console.Write(twoNewLines); // -------------------------------------------------------------------------- // Replace the encoded byte sequences for the characters 'X' and 'Z' with the // value 0xFF, which is outside the valid range of 0x00 to 0x7F for // ASCIIEncoding. The resulting byte sequence is actually the beginning of // this code example because it is the input to the decoder operation, and // is equivalent to a corrupted or improperly encoded byte sequence. encodedBytes[0] = 0xFF; encodedBytes[2] = 0xFF; Console.WriteLine("Display the corrupted byte sequence..."); Console.WriteLine("Encoded bytes in hexadecimal ({0} bytes):\n", numberOfEncodedBytes); foreach (byte b in encodedBytes) { Console.Write("0x{0:X2} ", (int)b); } Console.Write(twoNewLines); // -------------------------------------------------------------------------- // Attempt to decode the encoded bytes. However, an exception is thrown // before the byte sequence can be decoded. Console.WriteLine("Compare the decoded bytes to the input string..."); try { decodedString = ae.GetString(encodedBytes); } catch (DecoderFallbackException dfe) { Console.WriteLine(dfe); Console.WriteLine("\n*** THE CODE EXAMPLE TERMINATES HERE AS INTENDED. ***"); return; } // This statement is never executed. Console.WriteLine("This statement is never executed."); } } /* This code example produces the following results: The name of the encoding is "us-ascii". Input string (3 characters): "XYZ" Input string in hexadecimal: 0x58 0x59 0x5A Encode the input string... Encoded bytes in hexadecimal (3 bytes): 0x58 0x59 0x5A Display the corrupted byte sequence... Encoded bytes in hexadecimal (3 bytes): 0xFF 0x59 0xFF Compare the decoded bytes to the input string... System.Text.DecoderFallbackException: Unable to translate bytes [FF] at index 0 from speci fied code page to Unicode. at System.Text.DecoderExceptionFallbackBuffer.Throw(Byte[] bytesUnknown, Int32 index) at System.Text.DecoderExceptionFallbackBuffer.Fallback(Byte[] bytesUnknown, Int32 index ) at System.Text.DecoderFallbackBuffer.InternalFallback(Byte[] bytes, Byte* pBytes) at System.Text.ASCIIEncoding.GetCharCount(Byte* bytes, Int32 count, DecoderNLS decoder) at System.String.CreateStringFromEncoding(Byte* bytes, Int32 byteLength, Encoding encod ing) at System.Text.ASCIIEncoding.GetString(Byte[] bytes, Int32 byteIndex, Int32 byteCount) at System.Text.Encoding.GetString(Byte[] bytes) at Sample.Main() *** THE CODE EXAMPLE TERMINATES HERE AS INTENDED. *** */
// This example demonstrates the DecoderExceptionFallback class. using namespace System; using namespace System::Text; int main() { // Create an encoding, which is equivalent to calling the // ASCIIEncoding class constructor. // The DecoderExceptionFallback parameter specifies that an exception // is thrown if a character cannot be encoded. // An encoder exception fallback is also specified, but in this code // example the encoding operation cannot fail. Encoding^ asciiEncoding = Encoding::GetEncoding("us-ascii", gcnew EncoderExceptionFallback(), gcnew DecoderExceptionFallback()); String^ inputString = "XYZ"; String^ decodedString; String^ twoNewLines = Environment::NewLine + Environment::NewLine ; array<Byte>^ encodedBytes = gcnew array<Byte>(asciiEncoding->GetByteCount(inputString)); int numberOfEncodedBytes = 0; // --------------------------------------------------------------------- Console::Clear(); // Display the name of the encoding. Console::WriteLine("The name of the encoding is \"{0}\".{1}" , asciiEncoding->WebName, Environment::NewLine); // Display the input string in text. Console::WriteLine("Input string ({0} characters): \"{1}\"" , inputString->Length, inputString); // Display the input string in hexadecimal. Console::Write("Input string in hexadecimal: "); for each (char c in inputString) { Console::Write("0x{0:X2} ", c); } Console::Write(twoNewLines); // --------------------------------------------------------------------- // Encode the input string. Console::WriteLine("Encode the input string..."); numberOfEncodedBytes = asciiEncoding->GetBytes(inputString, 0, inputString->Length, encodedBytes, 0); // Display the encoded bytes. Console::WriteLine("Encoded bytes in hexadecimal ({0} bytes):{1}", numberOfEncodedBytes, Environment::NewLine); for each (Byte b in encodedBytes) { Console::Write("0x{0:X2} ", b); } Console::Write(twoNewLines); // --------------------------------------------------------------------- // Replace the encoded byte sequences for the characters 'X' and 'Z' // with the value 0xFF, which is outside the valid range of 0x00 to 0x7F // for ASCIIEncoding. The resulting byte sequence is actually the // beginning of this code example because it is the input to the decoder // operation, and is equivalent to a corrupted or improperly encoded // byte sequence. encodedBytes[0] = 0xFF; encodedBytes[2] = 0xFF; Console::WriteLine("Display the corrupted byte sequence..."); Console::WriteLine("Encoded bytes in hexadecimal ({0} bytes):{1}", numberOfEncodedBytes, Environment::NewLine); for each (Byte b in encodedBytes) { Console::Write("0x{0:X2} ", b); } Console::Write(twoNewLines); // --------------------------------------------------------------------- // Attempt to decode the encoded bytes. However, an exception is thrown // before the byte sequence can be decoded. Console::WriteLine("Compare the decoded bytes to the input string..."); try { decodedString = asciiEncoding->GetString(encodedBytes); // This statement is never executed. Console::WriteLine("This statement is never executed."); } catch (DecoderFallbackException^ ex) { Console::WriteLine(ex); Console::WriteLine( "{0}*** THE CODE EXAMPLE TERMINATES HERE AS INTENDED. ***", Environment::NewLine); } } /* This code example produces the following results: The name of the encoding is "us-ascii". Input string (3 characters): "XYZ" Input string in hexadecimal: 0x58 0x59 0x5A Encode the input string... Encoded bytes in hexadecimal (3 bytes): 0x58 0x59 0x5A Display the corrupted byte sequence... Encoded bytes in hexadecimal (3 bytes): 0xFF 0x59 0xFF Compare the decoded bytes to the input string... System.Text.DecoderFallbackException: Unable to translate bytes [FF] at index 0 from speci fied code page to Unicode. at System.Text.DecoderExceptionFallbackBuffer.Throw(Byte[] bytesUnknown, Int32 index) at System.Text.DecoderExceptionFallbackBuffer.Fallback(Byte[] bytesUnknown, Int32 index ) at System.Text.DecoderFallbackBuffer.InternalFallback(Byte[] bytes, Byte* pBytes) at System.Text.ASCIIEncoding.GetCharCount(Byte* bytes, Int32 count, DecoderNLS decoder) at System.String.CreateStringFromEncoding(Byte* bytes, Int32 byteLength, Encoding encod ing) at System.Text.ASCIIEncoding.GetString(Byte[] bytes, Int32 byteIndex, Int32 byteCount) at System.Text.Encoding.GetString(Byte[] bytes) at Sample.Main() *** THE CODE EXAMPLE TERMINATES HERE AS INTENDED. *** */

System.Text.DecoderFallback
System.Text.DecoderExceptionFallback


Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


- DecoderExceptionFallback クラスのページへのリンク