Encoder-Klasse
Konvertiert Zeichen in eine Bytefolge.
Namespace: System.Text
Assembly: mscorlib (in mscorlib.dll)
Syntax
'Declaration
<SerializableAttribute> _
<ComVisibleAttribute(True)> _
Public MustInherit Class Encoder
'Usage
Dim instance As Encoder
[SerializableAttribute]
[ComVisibleAttribute(true)]
public abstract class Encoder
[SerializableAttribute]
[ComVisibleAttribute(true)]
public ref class Encoder abstract
/** @attribute SerializableAttribute() */
/** @attribute ComVisibleAttribute(true) */
public abstract class Encoder
SerializableAttribute
ComVisibleAttribute(true)
public abstract class Encoder
Hinweise
Beim Codieren werden Zeichen in eine Bytefolge transformiert. Beim Decodieren wird dieser Vorgang umgekehrt: Eine Folge codierter Bytes wird in Zeichen transformiert.
Eine Encoder-Klasse erhält die Zustandsinformationen zwischen aufeinander folgenden Aufrufen der GetBytes-Methode aufrecht, damit Blöcke umfassende Zeichenfolgen korrekt codiert werden können. Die Encoder-Klasse behält nachfolgende Zeichen am Ende von Datenblöcken bei und verwendet diese im nächsten Codierungsvorgang. So kann ein Datenblock beispielsweise mit einem hohen Ersatzzeichen ohne Entsprechung enden, während sich das entsprechende niedrige Ersatzzeichen im nächsten Datenblock befindet. Deshalb empfehlen sich die Decoder-Klasse und die Encoder-Klasse für Netzwerkübertragungs- und Dateivorgänge, da bei diesen Vorgängen oft Datenblöcke anstelle vollständiger Datenstreams verwendet werden.
Die GetByteCount-Methode bestimmt, wie viele Bytes sich beim Codieren einer Reihe von Unicode-Zeichen ergeben, und die GetBytes-Methode führt die eigentliche Codierung durch.
Zum Abrufen einer Instanz der Implementierung dieser Klasse verwenden Sie die GetEncoder-Methode einer Encoding-Implementierung.
Versionsaspekte
Ein Decoder-Objekt oder Encoder-Objekt kann während einer Konvertierungsoperation serialisiert werden. Der Zustand eines Objektes wird beibehalten, wenn es in der gleichen Version des .NET Framework deserialisiert wird, verliert ihn jedoch, wenn es in einer anderen Version deserialisiert wird.
Hinweise für Erben Wenn diese Klasse vererbt wird, müssen Sie alle Member überschreiben.
Beispiel
Das folgende Codebeispiel veranschaulicht, wie mit einer angegebenen Codierung ein Array von Unicode-Zeichen in Byteblöcke konvertiert wird. Zum Vergleich wird das Array von Zeichen zuerst mit UTF7Encoding codiert. Anschließend wird das Array von Zeichen mit einem Encoder codiert.
Imports System
Imports System.Text
Imports Microsoft.VisualBasic
Imports Microsoft.VisualBasic.Strings
Class EncoderTest
Public Shared Sub Main()
' Unicode characters.
' ChrW(35) = #
' ChrW(37) = %
' ChrW(928) = Pi
' ChrW(931) = Sigma
Dim chars() As Char = {ChrW(35), ChrW(37), ChrW(928), ChrW(931)}
' Encode characters using an Encoding object.
Dim encoding As Encoding = Encoding.UTF7
Console.WriteLine( _
"Using Encoding" & _
ControlChars.NewLine & _
"--------------" _
)
' Encode complete array for comparison.
Dim allCharactersFromEncoding As Byte() = encoding.GetBytes(chars)
Console.WriteLine("All characters encoded:")
ShowArray(allCharactersFromEncoding)
' Encode characters, one-by-one.
' The Encoding object will NOT maintain state between calls.
Dim firstchar As Byte() = encoding.GetBytes(chars, 0, 1)
Console.WriteLine("First character:")
ShowArray(firstchar)
Dim secondchar As Byte() = encoding.GetBytes(chars, 1, 1)
Console.WriteLine("Second character:")
ShowArray(secondchar)
Dim thirdchar As Byte() = encoding.GetBytes(chars, 2, 1)
Console.WriteLine("Third character:")
ShowArray(thirdchar)
Dim fourthchar As Byte() = encoding.GetBytes(chars, 3, 1)
Console.WriteLine("Fourth character:")
ShowArray(fourthchar)
' Now, encode characters using an Encoder object.
Dim encoder As Encoder = encoding.GetEncoder()
Console.WriteLine( _
"Using Encoder" & _
ControlChars.NewLine & _
"-------------" _
)
' Encode complete array for comparison.
Dim allCharactersFromEncoder( _
encoder.GetByteCount(chars, 0, chars.Length, True) _
) As Byte
encoder.GetBytes(chars, 0, chars.Length, allCharactersFromEncoder, 0, True)
Console.WriteLine("All characters encoded:")
ShowArray(allCharactersFromEncoder)
' Do not flush state; i.e. maintain state between calls.
Dim bFlushState As Boolean = False
' Encode characters one-by-one.
' By maintaining state, the Encoder will not store extra bytes in the output.
Dim firstcharNoFlush( _
encoder.GetByteCount(chars, 0, 1, bFlushState) _
) As Byte
encoder.GetBytes(chars, 0, 1, firstcharNoFlush, 0, bFlushState)
Console.WriteLine("First character:")
ShowArray(firstcharNoFlush)
Dim secondcharNoFlush( _
encoder.GetByteCount(chars, 1, 1, bFlushState) _
) As Byte
encoder.GetBytes(chars, 1, 1, secondcharNoFlush, 0, bFlushState)
Console.WriteLine("Second character:")
ShowArray(secondcharNoFlush)
Dim thirdcharNoFlush( _
encoder.GetByteCount(chars, 2, 1, bFlushState) _
) As Byte
encoder.GetBytes(chars, 2, 1, thirdcharNoFlush, 0, bFlushState)
Console.WriteLine("Third character:")
ShowArray(thirdcharNoFlush)
' Must flush state on last call to GetBytes().
bFlushState = True
Dim fourthcharNoFlush( _
encoder.GetByteCount(chars, 3, 1, bFlushState) _
) As Byte
encoder.GetBytes(chars, 3, 1, fourthcharNoFlush, 0, bFlushState)
Console.WriteLine("Fourth character:")
ShowArray(fourthcharNoFlush)
End Sub 'Main
Public Shared Sub ShowArray(theArray As Array)
Dim o As Object
For Each o In theArray
Console.Write("[{0}]", o)
Next o
Console.WriteLine(ControlChars.NewLine)
End Sub 'ShowArray
End Class 'EncoderTest
using System;
using System.Text;
class EncoderTest {
public static void Main() {
// The characters to encode.
Char[] chars = new Char[] {
'\u0023', // #
'\u0025', // %
'\u03a0', // Pi
'\u03a3' // Sigma
};
// Encode characters using an Encoding object.
Encoding encoding = Encoding.UTF7;
Console.WriteLine("Using Encoding\n--------------");
// Encode complete array for comparison.
Byte[] allCharactersFromEncoding = encoding.GetBytes(chars);
Console.WriteLine("All characters encoded:");
ShowArray(allCharactersFromEncoding);
// Encode characters, one-by-one.
// The Encoding object will NOT maintain state between calls.
Byte[] firstchar = encoding.GetBytes(chars, 0, 1);
Console.WriteLine("First character:");
ShowArray(firstchar);
Byte[] secondchar = encoding.GetBytes(chars, 1, 1);
Console.WriteLine("Second character:");
ShowArray(secondchar);
Byte[] thirdchar = encoding.GetBytes(chars, 2, 1);
Console.WriteLine("Third character:");
ShowArray(thirdchar);
Byte[] fourthchar = encoding.GetBytes(chars, 3, 1);
Console.WriteLine("Fourth character:");
ShowArray(fourthchar);
// Now, encode characters using an Encoder object.
Encoder encoder = encoding.GetEncoder();
Console.WriteLine("Using Encoder\n-------------");
// Encode complete array for comparison.
Byte[] allCharactersFromEncoder = new Byte[encoder.GetByteCount(chars, 0, chars.Length, true)];
encoder.GetBytes(chars, 0, chars.Length, allCharactersFromEncoder, 0, true);
Console.WriteLine("All characters encoded:");
ShowArray(allCharactersFromEncoder);
// Do not flush state; i.e. maintain state between calls.
bool bFlushState = false;
// Encode characters one-by-one.
// By maintaining state, the Encoder will not store extra bytes in the output.
Byte[] firstcharNoFlush = new Byte[encoder.GetByteCount(chars, 0, 1, bFlushState)];
encoder.GetBytes(chars, 0, 1, firstcharNoFlush, 0, bFlushState);
Console.WriteLine("First character:");
ShowArray(firstcharNoFlush);
Byte[] secondcharNoFlush = new Byte[encoder.GetByteCount(chars, 1, 1, bFlushState)];
encoder.GetBytes(chars, 1, 1, secondcharNoFlush, 0, bFlushState);
Console.WriteLine("Second character:");
ShowArray(secondcharNoFlush);
Byte[] thirdcharNoFlush = new Byte[encoder.GetByteCount(chars, 2, 1, bFlushState)];
encoder.GetBytes(chars, 2, 1, thirdcharNoFlush, 0, bFlushState);
Console.WriteLine("Third character:");
ShowArray(thirdcharNoFlush);
// Must flush state on last call to GetBytes().
bFlushState = true;
Byte[] fourthcharNoFlush = new Byte[encoder.GetByteCount(chars, 3, 1, bFlushState)];
encoder.GetBytes(chars, 3, 1, fourthcharNoFlush, 0, bFlushState);
Console.WriteLine("Fourth character:");
ShowArray(fourthcharNoFlush);
}
public static void ShowArray(Array theArray) {
foreach (Object o in theArray) {
Console.Write("[{0}]", o);
}
Console.WriteLine("\n");
}
}
using namespace System;
using namespace System::Text;
using namespace System::Collections;
void ShowArray( Array^ theArray )
{
IEnumerator^ myEnum = theArray->GetEnumerator();
while ( myEnum->MoveNext() )
{
Object^ o = safe_cast<Object^>(myEnum->Current);
Console::Write( "[{0}]", o );
}
Console::WriteLine( "\n" );
}
int main()
{
// The characters to encode.
// Pi
// Sigma
array<Char>^chars = {L'\u03a0',L'\u03a3',L'\u03a6',L'\u03a9'};
// Encode characters using an Encoding Object*.
Encoding^ encoding = Encoding::UTF7;
Console::WriteLine( "Using Encoding\n--------------" );
// Encode complete array for comparison.
array<Byte>^allCharactersFromEncoding = encoding->GetBytes( chars );
Console::WriteLine( "All characters encoded:" );
ShowArray( allCharactersFromEncoding );
// Encode characters, one-by-one.
// The Encoding Object* will NOT maintain state between calls.
array<Byte>^firstchar = encoding->GetBytes( chars, 0, 1 );
Console::WriteLine( "First character:" );
ShowArray( firstchar );
array<Byte>^secondchar = encoding->GetBytes( chars, 1, 1 );
Console::WriteLine( "Second character:" );
ShowArray( secondchar );
array<Byte>^thirdchar = encoding->GetBytes( chars, 2, 1 );
Console::WriteLine( "Third character:" );
ShowArray( thirdchar );
array<Byte>^fourthchar = encoding->GetBytes( chars, 3, 1 );
Console::WriteLine( "Fourth character:" );
ShowArray( fourthchar );
// Now, encode characters using an Encoder Object*.
Encoder^ encoder = encoding->GetEncoder();
Console::WriteLine( "Using Encoder\n-------------" );
// Encode complete array for comparison.
array<Byte>^allCharactersFromEncoder = gcnew array<Byte>(encoder->GetByteCount( chars, 0, chars->Length, true ));
encoder->GetBytes( chars, 0, chars->Length, allCharactersFromEncoder, 0, true );
Console::WriteLine( "All characters encoded:" );
ShowArray( allCharactersFromEncoder );
// Do not flush state; i.e. maintain state between calls.
bool bFlushState = false;
// Encode characters one-by-one.
// By maintaining state, the Encoder will not store extra bytes in the output.
array<Byte>^firstcharNoFlush = gcnew array<Byte>(encoder->GetByteCount( chars, 0, 1, bFlushState ));
encoder->GetBytes( chars, 0, 1, firstcharNoFlush, 0, bFlushState );
Console::WriteLine( "First character:" );
ShowArray( firstcharNoFlush );
array<Byte>^secondcharNoFlush = gcnew array<Byte>(encoder->GetByteCount( chars, 1, 1, bFlushState ));
encoder->GetBytes( chars, 1, 1, secondcharNoFlush, 0, bFlushState );
Console::WriteLine( "Second character:" );
ShowArray( secondcharNoFlush );
array<Byte>^thirdcharNoFlush = gcnew array<Byte>(encoder->GetByteCount( chars, 2, 1, bFlushState ));
encoder->GetBytes( chars, 2, 1, thirdcharNoFlush, 0, bFlushState );
Console::WriteLine( "Third character:" );
ShowArray( thirdcharNoFlush );
// Must flush state on last call to GetBytes().
bFlushState = true;
array<Byte>^fourthcharNoFlush = gcnew array<Byte>(encoder->GetByteCount( chars, 3, 1, bFlushState ));
encoder->GetBytes( chars, 3, 1, fourthcharNoFlush, 0, bFlushState );
Console::WriteLine( "Fourth character:" );
ShowArray( fourthcharNoFlush );
}
import System.*;
import System.Text.*;
class EncoderTest
{
public static void main(String[] args)
{
// The characters to encode.
char chars[] = new char[] {
'\u0023', // #
'\u0025', // %
'\u03a0', // Pi
'\u03a3' // Sigma
};
// Encode characters using an Encoding object.
Encoding encoding = Encoding.get_UTF7();
Console.WriteLine("Using Encoding\n--------------");
// Encode complete array for comparison.
ubyte allCharactersFromEncoding[] = encoding.GetBytes(chars);
Console.WriteLine("All characters encoded:");
ShowArray(allCharactersFromEncoding);
// Encode characters, one-by-one.
// The Encoding object will NOT maintain state between calls.
ubyte firstchar[] = encoding.GetBytes(chars, 0, 1);
Console.WriteLine("First character:");
ShowArray(firstchar);
ubyte secondchar[] = encoding.GetBytes(chars, 1, 1);
Console.WriteLine("Second character:");
ShowArray(secondchar);
ubyte thirdchar[] = encoding.GetBytes(chars, 2, 1);
Console.WriteLine("Third character:");
ShowArray(thirdchar);
ubyte fourthchar[] = encoding.GetBytes(chars, 3, 1);
Console.WriteLine("Fourth character:");
ShowArray(fourthchar);
// Now, encode characters using an Encoder object.
Encoder encoder = encoding.GetEncoder();
Console.WriteLine("Using Encoder\n-------------");
// Encode complete array for comparison.
ubyte allCharactersFromEncoder[] = new
ubyte[encoder.GetByteCount(chars, 0, chars.length, true)];
encoder.GetBytes(chars, 0, chars.length,
allCharactersFromEncoder, 0, true);
Console.WriteLine("All characters encoded:");
ShowArray(allCharactersFromEncoder);
// Do not flush state; i.e. maintain state between calls.
boolean bFlushState = false;
// Encode characters one-by-one.
// By maintaining state, the Encoder will not store
// extra bytes in the output.
ubyte firstcharNoFlush[] = new
ubyte[encoder.GetByteCount(chars, 0, 1, bFlushState)];
encoder.GetBytes(chars, 0, 1, firstcharNoFlush, 0, bFlushState);
Console.WriteLine("First character:");
ShowArray(firstcharNoFlush);
ubyte secondcharNoFlush[] = new
ubyte[encoder.GetByteCount(chars, 1, 1, bFlushState)];
encoder.GetBytes(chars, 1, 1, secondcharNoFlush, 0, bFlushState);
Console.WriteLine("Second character:");
ShowArray(secondcharNoFlush);
ubyte thirdcharNoFlush[] = new
ubyte[encoder.GetByteCount(chars, 2, 1, bFlushState)];
encoder.GetBytes(chars, 2, 1, thirdcharNoFlush, 0, bFlushState);
Console.WriteLine("Third character:");
ShowArray(thirdcharNoFlush);
// Must flush state on last call to GetBytes().
bFlushState = true;
ubyte fourthcharNoFlush[] = new
ubyte[encoder.GetByteCount(chars, 3, 1, bFlushState)];
encoder.GetBytes(chars, 3, 1, fourthcharNoFlush, 0, bFlushState);
Console.WriteLine("Fourth character:");
ShowArray(fourthcharNoFlush);
} //main
public static void ShowArray(Array theArray)
{
Object o = null;
for(int iCtr = 0; iCtr < theArray.get_Length(); iCtr++) {
o = theArray.get_Item(iCtr);
Console.Write("[{0}]", o);
}
Console.WriteLine("\n");
} //ShowArray
} //EncoderTest
Vererbungshierarchie
System.Object
System.Text.Encoder
Threadsicherheit
Alle öffentlichen statischen (Shared in Visual Basic) Member dieses Typs sind threadsicher. Bei Instanzmembern ist die Threadsicherheit nicht gewährleistet.
Plattformen
Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile für Pocket PC, Windows Mobile für Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen.
Versionsinformationen
.NET Framework
Unterstützt in: 2.0, 1.1, 1.0
.NET Compact Framework
Unterstützt in: 2.0, 1.0
Siehe auch
Referenz
Encoder-Member
System.Text-Namespace
Decoder-Klasse
Encoding