Udostępnij za pośrednictwem


DecoderReplacementFallback Klasa

Definicja

Zapewnia mechanizm obsługi błędów, nazywany rezerwą, dla zakodowanej sekwencji bajtów wejściowych, której nie można przekonwertować na znak wyjściowy. Rezerwowy emituje określony przez użytkownika ciąg zastępczy zamiast zdekodowanej sekwencji bajtów wejściowych. Klasa ta nie może być dziedziczona.

public ref class DecoderReplacementFallback sealed : System::Text::DecoderFallback
public sealed class DecoderReplacementFallback : System.Text.DecoderFallback
[System.Serializable]
public sealed class DecoderReplacementFallback : System.Text.DecoderFallback
type DecoderReplacementFallback = class
    inherit DecoderFallback
[<System.Serializable>]
type DecoderReplacementFallback = class
    inherit DecoderFallback
Public NotInheritable Class DecoderReplacementFallback
Inherits DecoderFallback
Dziedziczenie
DecoderReplacementFallback
Atrybuty

Przykłady

W poniższym przykładzie kodu pokazano klasę DecoderReplacementFallback .

// This example demonstrates the DecoderReplacementFallback class.

using namespace System;
using namespace System::Text;

int main()
{ 
    // Create an encoding, which is equivalent to calling the 
    // ASCIIEncoding class constructor. 
    // The DecoderReplacementFallback parameter specifies that the 
    // string "(error)" is to replace characters that cannot be decoded. 
    // An encoder replacement fallback is also specified, but in this code
    // example the encoding operation cannot fail.  

    Encoding^ asciiEncoding = Encoding::GetEncoding("us-ascii",
        gcnew EncoderReplacementFallback("(unknown)"),
        gcnew DecoderReplacementFallback("(error)"));
    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);

    // ---------------------------------------------------------------------
    // Decode the encoded bytes.

    Console::WriteLine("Compare the decoded bytes to the input string...");
    decodedString = asciiEncoding->GetString(encodedBytes);

    // Display the input string and the decoded string for comparison.
    Console::WriteLine("Input string:  \"{0}\"", inputString);
    Console::WriteLine("Decoded string:\"{0}\"", decodedString);
}
/*
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...
Input string:  "XYZ"
Decoded string:"(error)Y(error)"

*/
// This example demonstrates the DecoderReplacementFallback 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 DecoderReplacementFallback parameter specifies that the
// string "(error)" is to replace characters that cannot be decoded.
// An encoder replacement fallback is also specified, but in this code
// example the encoding operation cannot fail.

    Encoding ae = Encoding.GetEncoding(
                  "us-ascii",
                  new EncoderReplacementFallback("(unknown)"),
                  new DecoderReplacementFallback("(error)"));
    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);

// --------------------------------------------------------------------------
// Decode the encoded bytes.

    Console.WriteLine("Compare the decoded bytes to the input string...");
    decodedString = ae.GetString(encodedBytes);

// Display the input string and the decoded string for comparison.
    Console.WriteLine("Input string:  \"{0}\"", inputString);
    Console.WriteLine("Decoded string:\"{0}\"", decodedString);
    }
}
/*
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...
Input string:  "XYZ"
Decoded string:"(error)Y(error)"

*/
' This example demonstrates the DecoderReplacementFallback class.
Imports System.Text

Class Sample
    Public Shared Sub Main() 
        
        ' Create an encoding, which is equivalent to calling the 
        ' ASCIIEncoding class constructor. 
        ' The DecoderReplacementFallback parameter specifies that the 
        ' string "(error)" is to replace characters that cannot be decoded. 
        ' An encoder replacement fallback is also specified, but in this code
        ' example the encoding operation cannot fail.  

        Dim erf As New EncoderReplacementFallback("(unknown)")
        Dim drf As New DecoderReplacementFallback("(error)")
        Dim ae As Encoding = Encoding.GetEncoding("us-ascii", erf, drf)
        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 implicitly 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...")
        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)
        
        ' --------------------------------------------------------------------------
        ' Decode the encoded bytes.
        Console.WriteLine("Compare the decoded bytes to the input string...")
        decodedString = ae.GetString(encodedBytes)
        
        ' Display the input string and the decoded string for comparison.
        Console.WriteLine("Input string:  ""{0}""", inputString)
        Console.WriteLine("Decoded string:""{0}""", decodedString)
    
    End Sub
End Class
'
'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...
'Input string:  "XYZ"
'Decoded string:"(error)Y(error)"
'

Uwagi

Częstą przyczyną niepowodzenia operacji kodowania lub dekodowania jest to, że podstawowa klasa kodowania nie zapewnia mapowania między znakiem a równoważną sekwencją bajtów. Na przykład ASCIIEncoding obiekt nie może zdekodować wartości bajtu większej niż 0x7F. Jeśli nie można przekonwertować sekwencji bajtów wejściowych na znak wyjściowy, DecoderReplacementFallback obiekt emituje ciąg zastępczy do danych wyjściowych, aby reprezentować oryginalną sekwencję bajtów wejściowych. Następnie proces konwersji kontynuuje dekodowanie pozostałej części oryginalnych danych wejściowych.

Ciąg zastępczy używany przez DecoderReplacementFallback obiekt jest określany przez wywołanie konstruktora klasy. Dostępne są dwie opcje:

Ta klasa jest jedną z dwóch klas .NET Framework, które implementują różne strategie rezerwowe do obsługi błędów konwersji dekodowania. Druga klasa to DecoderExceptionFallback klasa, która zgłasza błąd DecoderFallbackException w przypadku napotkania nieprawidłowej sekwencji bajtów.

Konstruktory

DecoderReplacementFallback()

Inicjuje nowe wystąpienie klasy DecoderReplacementFallback.

DecoderReplacementFallback(String)

Inicjuje DecoderReplacementFallback nowe wystąpienie klasy przy użyciu określonego ciągu zastępczego.

Właściwości

DefaultString

Pobiera ciąg zastępczy, który jest wartością DecoderReplacementFallback obiektu.

MaxCharCount

Pobiera liczbę znaków w ciągu zastępczym DecoderReplacementFallback dla obiektu.

Metody

CreateFallbackBuffer()

DecoderFallbackBuffer Tworzy obiekt zainicjowany za pomocą ciągu zastępczego tego DecoderReplacementFallback obiektu.

Equals(Object)

Wskazuje, czy wartość określonego obiektu jest równa obiektowi DecoderReplacementFallback .

GetHashCode()

Pobiera kod skrótu dla wartości DecoderReplacementFallback obiektu.

GetType()

Type Pobiera wartość bieżącego wystąpienia.

(Odziedziczone po Object)
MemberwiseClone()

Tworzy płytkią kopię bieżącego Objectelementu .

(Odziedziczone po Object)
ToString()

Zwraca ciąg reprezentujący bieżący obiekt.

(Odziedziczone po Object)

Dotyczy

Zobacz też