DecoderReplacementFallback Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Предоставляет механизм обработки ошибок, называемый резервным вариантом, закодированной входной последовательности байтов, которая не может быть преобразована в выходной символ. В резервном варианте вместо декодированной последовательности байтов выпускается заданная пользователем замещающая строка. Этот класс не наследуется.
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
- Наследование
- Атрибуты
Примеры
В следующем примере кода демонстрируется 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)"
'
Комментарии
Распространенной причиной сбоя операции кодирования или декодирования является то, что базовый класс кодирования не обеспечивает сопоставление между символом и эквивалентной последовательностью байтов. Например, ASCIIEncoding объект не может декодировать значение байта, превышающее 0x7F. Если входная последовательность байтов не может быть преобразована в выходной символ, DecoderReplacementFallback объект выдает строку замены в выходные данные для представления исходной входной байтовой последовательности. Затем процесс преобразования продолжает декодировать оставшуюся часть исходных входных данных.
Строка замены, используемая DecoderReplacementFallback объектом, определяется вызовом конструктора класса. Доступны следующие два параметра.
Замена символом по умолчанию. При вызове конструктора DecoderReplacementFallback() символ замены имеет значение "?" (U+003F).
Замена строкой по своему усмотрению. При вызове конструктора DecoderReplacementFallback(String) необходимо указать строку замены.
Этот класс является одним из двух классов платформа .NET Framework, реализующих различные резервные стратегии для обработки сбоев декодирования преобразования. Другой класс — это DecoderExceptionFallback класс, который вызывает исключение DecoderFallbackException при обнаружении недопустимой последовательности байтов.
Конструкторы
DecoderReplacementFallback() |
Инициализирует новый экземпляр класса DecoderReplacementFallback. |
DecoderReplacementFallback(String) |
Инициализирует новый экземпляр класса DecoderReplacementFallback указанной замещающей строкой. |
Свойства
DefaultString |
Получает замещающую строку, которая является значением объекта DecoderReplacementFallback. |
MaxCharCount |
Получает количество символов в замещающей строке для объекта DecoderReplacementFallback. |
Методы
CreateFallbackBuffer() |
Создает объект DecoderFallbackBuffer, который инициализируется с замещающей строкой этого объекта DecoderReplacementFallback. |
Equals(Object) |
Указывает, равно ли значение заданного объекта объекту DecoderReplacementFallback. |
GetHashCode() |
Извлекает хэш-код для значения объекта DecoderReplacementFallback. |
GetType() |
Возвращает объект Type для текущего экземпляра. (Унаследовано от Object) |
MemberwiseClone() |
Создает неполную копию текущего объекта Object. (Унаследовано от Object) |
ToString() |
Возвращает строку, представляющую текущий объект. (Унаследовано от Object) |