Encoding.GetBytes Methode

Definition

Wenn eine abgeleitete Klasse überschrieben wird, codiert eine Reihe von Zeichen in eine Bytesequenz.

Überlädt

Name Beschreibung
GetBytes(Char[])

Wenn sie in einer abgeleiteten Klasse überschrieben wird, werden alle Zeichen im angegebenen Zeichenarray in eine Folge von Bytes codiert.

GetBytes(String)

Wenn sie in einer abgeleiteten Klasse außer Kraft gesetzt wird, codiert sie alle Zeichen in der angegebenen Zeichenfolge in eine Folge von Bytes.

GetBytes(ReadOnlySpan<Char>, Span<Byte>)

Wenn sie in einer abgeleiteten Klasse überschrieben werden, codiert sie in einer Reihe von Bytes, die aus der angegebenen schreibgeschützten Spanne stammen.

GetBytes(Char[], Int32, Int32)

Wenn eine abgeleitete Klasse überschrieben wird, codiert eine Reihe von Zeichen aus dem angegebenen Zeichenarray in eine Folge von Bytes.

GetBytes(String, Int32, Int32)

Wenn sie in einer abgeleiteten Klasse überschrieben werden, codiert sie in ein Bytearray, das von der angegebenen Zeichenfolge ausgehend von count der angegebenen Zeichenfolge angegeben indexwird.

GetBytes(Char*, Int32, Byte*, Int32)

Wenn eine abgeleitete Klasse überschrieben wird, codiert eine Reihe von Zeichen, die am angegebenen Zeichenzeiger beginnen, in eine Abfolge von Bytes, die ab dem angegebenen Bytezeiger gespeichert werden.

GetBytes(Char[], Int32, Int32, Byte[], Int32)

Wenn eine abgeleitete Klasse überschrieben wird, codiert eine Reihe von Zeichen aus dem angegebenen Zeichenarray in das angegebene Bytearray.

GetBytes(String, Int32, Int32, Byte[], Int32)

Wenn eine abgeleitete Klasse überschrieben wird, codiert eine Reihe von Zeichen aus der angegebenen Zeichenfolge in das angegebene Bytearray.

GetBytes(Char[])

Wenn sie in einer abgeleiteten Klasse überschrieben wird, werden alle Zeichen im angegebenen Zeichenarray in eine Folge von Bytes codiert.

public:
 virtual cli::array <System::Byte> ^ GetBytes(cli::array <char> ^ chars);
public virtual byte[] GetBytes(char[] chars);
abstract member GetBytes : char[] -> byte[]
override this.GetBytes : char[] -> byte[]
Public Overridable Function GetBytes (chars As Char()) As Byte()

Parameter

chars
Char[]

Das Zeichenarray, das die zu codierenden Zeichen enthält.

Gibt zurück

Byte[]

Ein Bytearray, das die Ergebnisse der Codierung des angegebenen Zeichensatzes enthält.

Ausnahmen

chars ist null.

Ein Fallback ist aufgetreten (weitere Informationen finden Sie unter "Zeichencodierung in .NET")

-und-

EncoderFallback ist auf EncoderExceptionFallback festgelegt.

Beispiele

Im folgenden Beispiel wird die Anzahl der Bytes bestimmt, die zum Codieren eines Zeichenarrays erforderlich sind, die Zeichen codiert und die resultierenden Bytes angezeigt.

using System;
using System.Text;

public class SamplesEncoding  {

   public static void Main()  {

      // The characters to encode:
      //    Latin Small Letter Z (U+007A)
      //    Latin Small Letter A (U+0061)
      //    Combining Breve (U+0306)
      //    Latin Small Letter AE With Acute (U+01FD)
      //    Greek Small Letter Beta (U+03B2)
      //    a high-surrogate value (U+D8FF)
      //    a low-surrogate value (U+DCFF)
      char[] myChars = new char[] { 'z', 'a', '\u0306', '\u01FD', '\u03B2', '\uD8FF', '\uDCFF' };

      // Get different encodings.
      Encoding  u7    = Encoding.UTF7;
      Encoding  u8    = Encoding.UTF8;
      Encoding  u16LE = Encoding.Unicode;
      Encoding  u16BE = Encoding.BigEndianUnicode;
      Encoding  u32   = Encoding.UTF32;

      // Encode the entire array, and print out the counts and the resulting bytes.
      PrintCountsAndBytes( myChars, u7 );
      PrintCountsAndBytes( myChars, u8 );
      PrintCountsAndBytes( myChars, u16LE );
      PrintCountsAndBytes( myChars, u16BE );
      PrintCountsAndBytes( myChars, u32 );
   }

   public static void PrintCountsAndBytes( char[] chars, Encoding enc )  {

      // Display the name of the encoding used.
      Console.Write( "{0,-30} :", enc.ToString() );

      // Display the exact byte count.
      int iBC  = enc.GetByteCount( chars );
      Console.Write( " {0,-3}", iBC );

      // Display the maximum byte count.
      int iMBC = enc.GetMaxByteCount( chars.Length );
      Console.Write( " {0,-3} :", iMBC );

      // Encode the array of chars.
      byte[] bytes = enc.GetBytes( chars );

      // Display all the encoded bytes.
      PrintHexBytes( bytes );
   }

   public static void PrintHexBytes( byte[] bytes )  {

      if (( bytes == null ) || ( bytes.Length == 0 ))
        {
            Console.WriteLine( "<none>" );
        }
        else  {
         for ( int i = 0; i < bytes.Length; i++ )
            Console.Write( "{0:X2} ", bytes[i] );
         Console.WriteLine();
      }
   }
}


/* 
This code produces the following output.

System.Text.UTF7Encoding       : 18  23  :7A 61 2B 41 77 59 42 2F 51 4F 79 32 50 2F 63 2F 77 2D
System.Text.UTF8Encoding       : 12  24  :7A 61 CC 86 C7 BD CE B2 F1 8F B3 BF
System.Text.UnicodeEncoding    : 14  16  :7A 00 61 00 06 03 FD 01 B2 03 FF D8 FF DC
System.Text.UnicodeEncoding    : 14  16  :00 7A 00 61 03 06 01 FD 03 B2 D8 FF DC FF
System.Text.UTF32Encoding      : 24  32  :7A 00 00 00 61 00 00 00 06 03 00 00 FD 01 00 00 B2 03 00 00 FF FC 04 00

*/
Imports System.Text

Public Class SamplesEncoding   

   Public Shared Sub Main()

      ' The characters to encode:
      '    Latin Small Letter Z (U+007A)
      '    Latin Small Letter A (U+0061)
      '    Combining Breve (U+0306)
      '    Latin Small Letter AE With Acute (U+01FD)
      '    Greek Small Letter Beta (U+03B2)
      '    a high-surrogate value (U+D8FF)
      '    a low-surrogate value (U+DCFF)
      Dim myChars() As Char = {"z"c, "a"c, ChrW(&H0306), ChrW(&H01FD), ChrW(&H03B2), ChrW(&HD8FF), ChrW(&HDCFF)}
 

      ' Get different encodings.
      Dim u7 As Encoding = Encoding.UTF7
      Dim u8 As Encoding = Encoding.UTF8
      Dim u16LE As Encoding = Encoding.Unicode
      Dim u16BE As Encoding = Encoding.BigEndianUnicode
      Dim u32 As Encoding = Encoding.UTF32

      ' Encode the entire array, and print out the counts and the resulting bytes.
      PrintCountsAndBytes(myChars, u7)
      PrintCountsAndBytes(myChars, u8)
      PrintCountsAndBytes(myChars, u16LE)
      PrintCountsAndBytes(myChars, u16BE)
      PrintCountsAndBytes(myChars, u32)

   End Sub


   Public Shared Sub PrintCountsAndBytes(chars() As Char, enc As Encoding)

      ' Display the name of the encoding used.
      Console.Write("{0,-30} :", enc.ToString())

      ' Display the exact byte count.
      Dim iBC As Integer = enc.GetByteCount(chars)
      Console.Write(" {0,-3}", iBC)

      ' Display the maximum byte count.
      Dim iMBC As Integer = enc.GetMaxByteCount(chars.Length)
      Console.Write(" {0,-3} :", iMBC)

      ' Encode the array of chars.
      Dim bytes As Byte() = enc.GetBytes(chars)

      ' Display all the encoded bytes.
      PrintHexBytes(bytes)

   End Sub


   Public Shared Sub PrintHexBytes(bytes() As Byte)

      If bytes Is Nothing OrElse bytes.Length = 0 Then
         Console.WriteLine("<none>")
      Else
         Dim i As Integer
         For i = 0 To bytes.Length - 1
            Console.Write("{0:X2} ", bytes(i))
         Next i
         Console.WriteLine()
      End If

   End Sub

End Class


'This code produces the following output.
'
'System.Text.UTF7Encoding       : 18  23  :7A 61 2B 41 77 59 42 2F 51 4F 79 32 50 2F 63 2F 77 2D
'System.Text.UTF8Encoding       : 12  24  :7A 61 CC 86 C7 BD CE B2 F1 8F B3 BF
'System.Text.UnicodeEncoding    : 14  16  :7A 00 61 00 06 03 FD 01 B2 03 FF D8 FF DC
'System.Text.UnicodeEncoding    : 14  16  :00 7A 00 61 03 06 01 FD 03 B2 D8 FF DC FF
'System.Text.UTF32Encoding      : 24  32  :7A 00 00 00 61 00 00 00 06 03 00 00 FD 01 00 00 B2 03 00 00 FF FC 04 00

Hinweise

Wenn die zu konvertierenden Daten nur in sequenziellen Blöcken (z. B. aus einem Datenstrom gelesene Daten) verfügbar sind oder die Datenmenge so groß ist, dass sie in kleinere Blöcke unterteilt werden muss, sollten Sie die Decoder oder die Encoder von der GetDecoder Methode bzw. methode bereitgestellte Methode bzw. Methode GetEncoder einer abgeleiteten Klasse verwenden.

Die GetByteCount Methode bestimmt, wie viele Byte eine Reihe von Unicode-Zeichen codieren, und die GetBytes Methode führt die tatsächliche Codierung aus. Die GetBytes Methode erwartet diskrete Konvertierungen, im Gegensatz zur Encoder.GetBytes Methode, die mehrere Konvertierungen in einem einzelnen Eingabedatenstrom verarbeitet.

Mehrere Versionen von GetByteCount und GetBytes werden unterstützt. Im Folgenden finden Sie einige Programmierüberlegungen für die Verwendung dieser Methoden:

  • Ihre App muss möglicherweise viele Eingabezeichen auf eine Codeseite codieren und die Zeichen mithilfe mehrerer Aufrufe verarbeiten. In diesem Fall müssen Sie wahrscheinlich den Zustand zwischen Aufrufen beibehalten, wobei der Zustand berücksichtigt wird, der Encoder vom verwendeten Objekt beibehalten wird. (Beispielsweise kann eine Zeichensequenz, die Surrogatepaare enthält, mit einem hohen Ersatz enden. Dies Encoder wird daran denken, dass hohe Surrogate so kombiniert werden kann, dass es mit einem niedrigen Ersatz am Anfang eines folgenden Aufrufs kombiniert werden kann. Encoding Kann den Zustand nicht beibehalten, sodass das Zeichen an die EncoderFallback.) gesendet wird.

  • Wenn Ihre App Zeichenfolgeneingaben verarbeitet, sollten Sie die Zeichenfolgenversion der GetBytes Methode aufrufen.

  • Die Unicode-Zeichenpufferversion ermöglicht GetBytes(Char*, Int32, Byte*, Int32) einige schnelle Techniken, insbesondere bei mehreren Aufrufen, die das Encoder Objekt verwenden oder in vorhandene Puffer einfügen. Bedenken Sie jedoch, dass diese Methodenversion manchmal unsicher ist, da Zeiger erforderlich sind.

  • Wenn Ihre App eine große Datenmenge konvertieren muss, sollte sie den Ausgabepuffer wiederverwenden. In diesem Fall ist die Version, die GetBytes Bytearrays unterstützt, die beste Wahl.

  • Erwägen Sie die Verwendung der Encoder.Convert Methode anstelle von GetByteCount. Die Konvertierungsmethode konvertiert so viele Daten wie möglich und löst eine Ausnahme aus, wenn der Ausgabepuffer zu klein ist. Für die kontinuierliche Codierung eines Datenstroms ist diese Methode häufig die beste Wahl.

Weitere Informationen

Gilt für:

GetBytes(String)

Wenn sie in einer abgeleiteten Klasse außer Kraft gesetzt wird, codiert sie alle Zeichen in der angegebenen Zeichenfolge in eine Folge von Bytes.

public:
 virtual cli::array <System::Byte> ^ GetBytes(System::String ^ s);
public virtual byte[] GetBytes(string s);
abstract member GetBytes : string -> byte[]
override this.GetBytes : string -> byte[]
Public Overridable Function GetBytes (s As String) As Byte()

Parameter

s
String

Die Zeichenfolge, die die zu codierenden Zeichen enthält.

Gibt zurück

Byte[]

Ein Bytearray, das die Ergebnisse der Codierung des angegebenen Zeichensatzes enthält.

Ausnahmen

s ist null.

Ein Fallback ist aufgetreten (weitere Informationen finden Sie unter "Zeichencodierung in .NET")

-und-

EncoderFallback ist auf EncoderExceptionFallback festgelegt.

Beispiele

Das folgende Beispiel bestimmt die Anzahl der Bytes, die zum Codieren einer Zeichenfolge oder eines Bereichs in der Zeichenfolge erforderlich sind, codiert die Zeichen und zeigt die resultierenden Bytes an.

using System;
using System.Text;

public class SamplesEncoding  {

   public static void Main()  {

      // The characters to encode:
      //    Latin Small Letter Z (U+007A)
      //    Latin Small Letter A (U+0061)
      //    Combining Breve (U+0306)
      //    Latin Small Letter AE With Acute (U+01FD)
      //    Greek Small Letter Beta (U+03B2)
      //    a high-surrogate value (U+D8FF)
      //    a low-surrogate value (U+DCFF)
      String myStr = "za\u0306\u01FD\u03B2\uD8FF\uDCFF";

      // Get different encodings.
      Encoding  u7    = Encoding.UTF7;
      Encoding  u8    = Encoding.UTF8;
      Encoding  u16LE = Encoding.Unicode;
      Encoding  u16BE = Encoding.BigEndianUnicode;
      Encoding  u32   = Encoding.UTF32;

      // Encode the entire string, and print out the counts and the resulting bytes.
      Console.WriteLine( "Encoding the entire string:" );
      PrintCountsAndBytes( myStr, u7 );
      PrintCountsAndBytes( myStr, u8 );
      PrintCountsAndBytes( myStr, u16LE );
      PrintCountsAndBytes( myStr, u16BE );
      PrintCountsAndBytes( myStr, u32 );

      Console.WriteLine();

      // Encode three characters starting at index 4, and print out the counts and the resulting bytes.
      Console.WriteLine( "Encoding the characters from index 4 through 6:" );
      PrintCountsAndBytes( myStr, 4, 3, u7 );
      PrintCountsAndBytes( myStr, 4, 3, u8 );
      PrintCountsAndBytes( myStr, 4, 3, u16LE );
      PrintCountsAndBytes( myStr, 4, 3, u16BE );
      PrintCountsAndBytes( myStr, 4, 3, u32 );
   }

   public static void PrintCountsAndBytes( String s, Encoding enc )  {

      // Display the name of the encoding used.
      Console.Write( "{0,-30} :", enc.ToString() );

      // Display the exact byte count.
      int iBC  = enc.GetByteCount( s );
      Console.Write( " {0,-3}", iBC );

      // Display the maximum byte count.
      int iMBC = enc.GetMaxByteCount( s.Length );
      Console.Write( " {0,-3} :", iMBC );

      // Encode the entire string.
      byte[] bytes = enc.GetBytes( s );

      // Display all the encoded bytes.
      PrintHexBytes( bytes );
   }

   public static void PrintCountsAndBytes( String s, int index, int count, Encoding enc )  {

      // Display the name of the encoding used.
      Console.Write( "{0,-30} :", enc.ToString() );

      // Display the exact byte count.
      int iBC  = enc.GetByteCount( s.ToCharArray(), index, count );
      Console.Write( " {0,-3}", iBC );

      // Display the maximum byte count.
      int iMBC = enc.GetMaxByteCount( count );
      Console.Write( " {0,-3} :", iMBC );

      // Encode a range of characters in the string.
      byte[] bytes = new byte[iBC];
      enc.GetBytes( s, index, count, bytes, bytes.GetLowerBound(0) );

      // Display all the encoded bytes.
      PrintHexBytes( bytes );
   }

   public static void PrintHexBytes( byte[] bytes )  {

      if (( bytes == null ) || ( bytes.Length == 0 ))
        {
            Console.WriteLine( "<none>" );
        }
        else  {
         for ( int i = 0; i < bytes.Length; i++ )
            Console.Write( "{0:X2} ", bytes[i] );
         Console.WriteLine();
      }
   }
}


/* 
This code produces the following output.

Encoding the entire string:
System.Text.UTF7Encoding       : 18  23  :7A 61 2B 41 77 59 42 2F 51 4F 79 32 50 2F 63 2F 77 2D
System.Text.UTF8Encoding       : 12  24  :7A 61 CC 86 C7 BD CE B2 F1 8F B3 BF
System.Text.UnicodeEncoding    : 14  16  :7A 00 61 00 06 03 FD 01 B2 03 FF D8 FF DC
System.Text.UnicodeEncoding    : 14  16  :00 7A 00 61 03 06 01 FD 03 B2 D8 FF DC FF
System.Text.UTF32Encoding      : 24  32  :7A 00 00 00 61 00 00 00 06 03 00 00 FD 01 00 00 B2 03 00 00 FF FC 04 00

Encoding the characters from index 4 through 6:
System.Text.UTF7Encoding       : 10  11  :2B 41 37 4C 59 2F 39 7A 2F 2D
System.Text.UTF8Encoding       : 6   12  :CE B2 F1 8F B3 BF
System.Text.UnicodeEncoding    : 6   8   :B2 03 FF D8 FF DC
System.Text.UnicodeEncoding    : 6   8   :03 B2 D8 FF DC FF
System.Text.UTF32Encoding      : 8   16  :B2 03 00 00 FF FC 04 00

*/
Imports System.Text

Public Class SamplesEncoding   

   Public Shared Sub Main()

      ' The characters to encode:
      '    Latin Small Letter Z (U+007A)
      '    Latin Small Letter A (U+0061)
      '    Combining Breve (U+0306)
      '    Latin Small Letter AE With Acute (U+01FD)
      '    Greek Small Letter Beta (U+03B2)
      '    a high-surrogate value (U+D8FF)
      '    a low-surrogate value (U+DCFF)
      Dim myStr As String = "za" & ChrW(&H0306) & ChrW(&H01FD) & ChrW(&H03B2) & ChrW(&HD8FF) & ChrW(&HDCFF)

      ' Get different encodings.
      Dim u7 As Encoding = Encoding.UTF7
      Dim u8 As Encoding = Encoding.UTF8
      Dim u16LE As Encoding = Encoding.Unicode
      Dim u16BE As Encoding = Encoding.BigEndianUnicode
      Dim u32 As Encoding = Encoding.UTF32

      ' Encode the entire string, and print out the counts and the resulting bytes.
      Console.WriteLine("Encoding the entire string:")
      PrintCountsAndBytes(myStr, u7)
      PrintCountsAndBytes(myStr, u8)
      PrintCountsAndBytes(myStr, u16LE)
      PrintCountsAndBytes(myStr, u16BE)
      PrintCountsAndBytes(myStr, u32)

      Console.WriteLine()

      ' Encode three characters starting at index 4, and print out the counts and the resulting bytes.
      Console.WriteLine("Encoding the characters from index 4 through 6:")
      PrintCountsAndBytes(myStr, 4, 3, u7)
      PrintCountsAndBytes(myStr, 4, 3, u8)
      PrintCountsAndBytes(myStr, 4, 3, u16LE)
      PrintCountsAndBytes(myStr, 4, 3, u16BE)
      PrintCountsAndBytes(myStr, 4, 3, u32)

   End Sub


   Overloads Public Shared Sub PrintCountsAndBytes(s As String, enc As Encoding)

      ' Display the name of the encoding used.
      Console.Write("{0,-30} :", enc.ToString())

      ' Display the exact byte count.
      Dim iBC As Integer = enc.GetByteCount(s)
      Console.Write(" {0,-3}", iBC)

      ' Display the maximum byte count.
      Dim iMBC As Integer = enc.GetMaxByteCount(s.Length)
      Console.Write(" {0,-3} :", iMBC)

      ' Encode the entire string.
      Dim bytes As Byte() = enc.GetBytes(s)

      ' Display all the encoded bytes.
      PrintHexBytes(bytes)

   End Sub


   Overloads Public Shared Sub PrintCountsAndBytes(s As String, index As Integer, count As Integer, enc As Encoding)

      ' Display the name of the encoding used.
      Console.Write("{0,-30} :", enc.ToString())

      ' Display the exact byte count.
      Dim iBC As Integer = enc.GetByteCount(s.ToCharArray(), index, count)
      Console.Write(" {0,-3}", iBC)

      ' Display the maximum byte count.
      Dim iMBC As Integer = enc.GetMaxByteCount(count)
      Console.Write(" {0,-3} :", iMBC)

      ' Encode a range of characters in the string.
      ' NOTE: In VB.NET, arrays contain one extra element by default.
      '       The following line creates the array with the exact number of elements required.
      Dim bytes(iBC - 1) As Byte
      enc.GetBytes(s, index, count, bytes, bytes.GetLowerBound(0))

      ' Display all the encoded bytes.
      PrintHexBytes(bytes)

   End Sub


   Public Shared Sub PrintHexBytes(bytes() As Byte)

      If bytes Is Nothing OrElse bytes.Length = 0 Then
         Console.WriteLine("<none>")
      Else
         Dim i As Integer
         For i = 0 To bytes.Length - 1
            Console.Write("{0:X2} ", bytes(i))
         Next i
         Console.WriteLine()
      End If

   End Sub

End Class


'This code produces the following output.
'
'Encoding the entire string:
'System.Text.UTF7Encoding       : 18  23  :7A 61 2B 41 77 59 42 2F 51 4F 79 32 50 2F 63 2F 77 2D
'System.Text.UTF8Encoding       : 12  24  :7A 61 CC 86 C7 BD CE B2 F1 8F B3 BF
'System.Text.UnicodeEncoding    : 14  16  :7A 00 61 00 06 03 FD 01 B2 03 FF D8 FF DC
'System.Text.UnicodeEncoding    : 14  16  :00 7A 00 61 03 06 01 FD 03 B2 D8 FF DC FF
'System.Text.UTF32Encoding      : 24  32  :7A 00 00 00 61 00 00 00 06 03 00 00 FD 01 00 00 B2 03 00 00 FF FC 04 00
'
'Encoding the characters from index 4 through 6:
'System.Text.UTF7Encoding       : 10  11  :2B 41 37 4C 59 2F 39 7A 2F 2D
'System.Text.UTF8Encoding       : 6   12  :CE B2 F1 8F B3 BF
'System.Text.UnicodeEncoding    : 6   8   :B2 03 FF D8 FF DC
'System.Text.UnicodeEncoding    : 6   8   :03 B2 D8 FF DC FF
'System.Text.UTF32Encoding      : 8   16  :B2 03 00 00 FF FC 04 00

Hinweise

Wenn die zu konvertierenden Daten nur in sequenziellen Blöcken (z. B. aus einem Datenstrom gelesene Daten) verfügbar sind oder die Datenmenge so groß ist, dass sie in kleinere Blöcke unterteilt werden muss, sollten Sie die Decoder oder die Encoder von der GetDecoder Methode bzw. methode bereitgestellte Methode bzw. Methode GetEncoder einer abgeleiteten Klasse verwenden.

Die GetByteCount Methode bestimmt, wie viele Byte eine Reihe von Unicode-Zeichen codieren, und die GetBytes Methode führt die tatsächliche Codierung aus. Die Encoding.GetBytes Methode erwartet diskrete Konvertierungen, im Gegensatz zur Encoder.GetBytes Methode, die mehrere Konvertierungen in einem einzelnen Eingabedatenstrom verarbeitet.

Mehrere Versionen von GetByteCount und GetBytes werden unterstützt. Im Folgenden finden Sie einige Programmierüberlegungen für die Verwendung dieser Methoden:

  • Ihre App muss möglicherweise viele Eingabezeichen auf eine Codeseite codieren und die Zeichen mithilfe mehrerer Aufrufe verarbeiten. In diesem Fall müssen Sie wahrscheinlich den Zustand zwischen Aufrufen beibehalten, wobei der Zustand berücksichtigt wird, der Encoder vom verwendeten Objekt beibehalten wird. (Beispielsweise kann eine Zeichensequenz, die Surrogatepaare enthält, mit einem hohen Ersatz enden. Dies Encoder wird daran denken, dass hohe Surrogate so kombiniert werden kann, dass es mit einem niedrigen Ersatz am Anfang eines folgenden Aufrufs kombiniert werden kann. Encoding Kann den Zustand nicht beibehalten, sodass das Zeichen an die EncoderFallback.) gesendet wird.

  • Wenn Ihre App Zeichenfolgeneingaben verarbeitet, sollten Sie die Zeichenfolgenversion von GetBytes.

  • Die Unicode-Zeichenpufferversion ermöglicht GetBytes(Char*, Int32, Byte*, Int32) einige schnelle Techniken, insbesondere bei mehreren Aufrufen, die das Encoder Objekt verwenden oder in vorhandene Puffer einfügen. Bedenken Sie jedoch, dass diese Methodenversion manchmal unsicher ist, da Zeiger erforderlich sind.

  • Wenn Ihre App eine große Datenmenge konvertieren muss, sollte sie den Ausgabepuffer wiederverwenden. In diesem Fall ist die Version, die GetBytes Bytearrays unterstützt, die beste Wahl.

  • Erwägen Sie die Verwendung der Encoder.Convert Methode anstelle von GetByteCount. Die Konvertierungsmethode konvertiert so viele Daten wie möglich und löst eine Ausnahme aus, wenn der Ausgabepuffer zu klein ist. Für die kontinuierliche Codierung eines Datenstroms ist diese Methode häufig die beste Wahl.

Weitere Informationen

Gilt für:

GetBytes(ReadOnlySpan<Char>, Span<Byte>)

Wenn sie in einer abgeleiteten Klasse überschrieben werden, codiert sie in einer Reihe von Bytes, die aus der angegebenen schreibgeschützten Spanne stammen.

public:
 virtual int GetBytes(ReadOnlySpan<char> chars, Span<System::Byte> bytes);
public virtual int GetBytes(ReadOnlySpan<char> chars, Span<byte> bytes);
abstract member GetBytes : ReadOnlySpan<char> * Span<byte> -> int
override this.GetBytes : ReadOnlySpan<char> * Span<byte> -> int
Public Overridable Function GetBytes (chars As ReadOnlySpan(Of Char), bytes As Span(Of Byte)) As Integer

Parameter

chars
ReadOnlySpan<Char>

Die Spanne, die den zu codierenden Zeichensatz enthält.

bytes
Span<Byte>

Die Bytespanne, um die codierten Bytes aufzunehmen.

Gibt zurück

Die Anzahl der codierten Bytes.

Hinweise

Wenn die zu konvertierenden Daten nur in sequenziellen Blöcken (z. B. aus einem Datenstrom gelesene Daten) verfügbar sind oder die Datenmenge so groß ist, dass sie in kleinere Blöcke unterteilt werden muss, sollten Sie die Decoder oder die Encoder von der GetDecoder Methode bzw. methode bereitgestellte Methode bzw. Methode GetEncoder einer abgeleiteten Klasse verwenden.

Die GetByteCount Methode bestimmt, wie viele Byte eine Reihe von Unicode-Zeichen codieren, und die GetBytes Methode führt die tatsächliche Codierung aus. Die Encoding.GetBytes Methode erwartet diskrete Konvertierungen, im Gegensatz zur Encoder.GetBytes Methode, die mehrere Konvertierungen in einem einzelnen Eingabedatenstrom verarbeitet.

Mehrere Versionen von GetByteCount und GetBytes werden unterstützt. Im Folgenden finden Sie einige Programmierüberlegungen für die Verwendung dieser Methoden:

  • Ihre App muss möglicherweise viele Eingabezeichen auf eine Codeseite codieren und die Zeichen mithilfe mehrerer Aufrufe verarbeiten. In diesem Fall müssen Sie wahrscheinlich den Zustand zwischen Aufrufen beibehalten, wobei der Zustand berücksichtigt wird, der Encoder vom verwendeten Objekt beibehalten wird. (Beispielsweise kann eine Zeichensequenz, die Surrogatepaare enthält, mit einem hohen Ersatz enden. Dies Encoder wird daran denken, dass hohe Surrogate so kombiniert werden kann, dass es mit einem niedrigen Ersatz am Anfang eines folgenden Aufrufs kombiniert werden kann. Encoding Kann den Zustand nicht beibehalten, sodass das Zeichen an die EncoderFallback.) gesendet wird.

  • Wenn Ihre App Zeichenfolgeneingaben verarbeitet, sollten Sie die Zeichenfolgenversion von GetBytes.

  • Wenn Ihre App eine große Datenmenge konvertieren muss, sollte sie den Ausgabepuffer wiederverwenden. In diesem Fall ist die Version, die GetBytes Bytearrays unterstützt, die beste Wahl.

  • Erwägen Sie die Verwendung der Encoder.Convert Methode anstelle von GetByteCount. Die Konvertierungsmethode konvertiert so viele Daten wie möglich und löst eine Ausnahme aus, wenn der Ausgabepuffer zu klein ist. Für die kontinuierliche Codierung eines Datenstroms ist diese Methode häufig die beste Wahl.

Gilt für:

GetBytes(Char[], Int32, Int32)

Wenn eine abgeleitete Klasse überschrieben wird, codiert eine Reihe von Zeichen aus dem angegebenen Zeichenarray in eine Folge von Bytes.

public:
 virtual cli::array <System::Byte> ^ GetBytes(cli::array <char> ^ chars, int index, int count);
public virtual byte[] GetBytes(char[] chars, int index, int count);
abstract member GetBytes : char[] * int * int -> byte[]
override this.GetBytes : char[] * int * int -> byte[]
Public Overridable Function GetBytes (chars As Char(), index As Integer, count As Integer) As Byte()

Parameter

chars
Char[]

Das Zeichenarray, das die zu codierenden Zeichensätze enthält.

index
Int32

Der Index des ersten zu codierenden Zeichens.

count
Int32

Die Anzahl der zu codierenden Zeichen.

Gibt zurück

Byte[]

Ein Bytearray, das die Ergebnisse der Codierung des angegebenen Zeichensatzes enthält.

Ausnahmen

chars ist null.

index oder count ist kleiner als Null.

-oder-

index und count keinen gültigen Bereich in chars.

Ein Fallback ist aufgetreten (weitere Informationen finden Sie unter "Zeichencodierung in .NET")

-und-

EncoderFallback ist auf EncoderExceptionFallback festgelegt.

Beispiele

Im folgenden Beispiel wird die Anzahl der Bytes bestimmt, die erforderlich sind, um drei Zeichen aus einem Zeichenarray zu codieren, die Zeichen zu codieren und die resultierenden Bytes anzuzeigen.

using System;
using System.Text;

public class SamplesEncoding  {

   public static void Main()  {

      // The characters to encode:
      //    Latin Small Letter Z (U+007A)
      //    Latin Small Letter A (U+0061)
      //    Combining Breve (U+0306)
      //    Latin Small Letter AE With Acute (U+01FD)
      //    Greek Small Letter Beta (U+03B2)
      //    a high-surrogate value (U+D8FF)
      //    a low-surrogate value (U+DCFF)
      char[] myChars = new char[] { 'z', 'a', '\u0306', '\u01FD', '\u03B2', '\uD8FF', '\uDCFF' };

      // Get different encodings.
      Encoding  u7    = Encoding.UTF7;
      Encoding  u8    = Encoding.UTF8;
      Encoding  u16LE = Encoding.Unicode;
      Encoding  u16BE = Encoding.BigEndianUnicode;
      Encoding  u32   = Encoding.UTF32;

      // Encode three characters starting at index 4, and print out the counts and the resulting bytes.
      PrintCountsAndBytes( myChars, 4, 3, u7 );
      PrintCountsAndBytes( myChars, 4, 3, u8 );
      PrintCountsAndBytes( myChars, 4, 3, u16LE );
      PrintCountsAndBytes( myChars, 4, 3, u16BE );
      PrintCountsAndBytes( myChars, 4, 3, u32 );
   }

   public static void PrintCountsAndBytes( char[] chars, int index, int count, Encoding enc )  {

      // Display the name of the encoding used.
      Console.Write( "{0,-30} :", enc.ToString() );

      // Display the exact byte count.
      int iBC  = enc.GetByteCount( chars, index, count );
      Console.Write( " {0,-3}", iBC );

      // Display the maximum byte count.
      int iMBC = enc.GetMaxByteCount( count );
      Console.Write( " {0,-3} :", iMBC );

      // Encode the array of chars.
      byte[] bytes = enc.GetBytes( chars, index, count );

      // The following is an alternative way to encode the array of chars:
      // byte[] bytes = new byte[iBC];
      // enc.GetBytes( chars, index, count, bytes, bytes.GetLowerBound(0) );

      // Display all the encoded bytes.
      PrintHexBytes( bytes );
   }

   public static void PrintHexBytes( byte[] bytes )  {

      if (( bytes == null ) || ( bytes.Length == 0 ))
        {
            Console.WriteLine( "<none>" );
        }
        else  {
         for ( int i = 0; i < bytes.Length; i++ )
            Console.Write( "{0:X2} ", bytes[i] );
         Console.WriteLine();
      }
   }
}


/* 
This code produces the following output.

System.Text.UTF7Encoding       : 10  11  :2B 41 37 4C 59 2F 39 7A 2F 2D
System.Text.UTF8Encoding       : 6   12  :CE B2 F1 8F B3 BF
System.Text.UnicodeEncoding    : 6   8   :B2 03 FF D8 FF DC
System.Text.UnicodeEncoding    : 6   8   :03 B2 D8 FF DC FF
System.Text.UTF32Encoding      : 8   16  :B2 03 00 00 FF FC 04 00

*/
Imports System.Text

Public Class SamplesEncoding   

   Public Shared Sub Main()

      ' The characters to encode:
      '    Latin Small Letter Z (U+007A)
      '    Latin Small Letter A (U+0061)
      '    Combining Breve (U+0306)
      '    Latin Small Letter AE With Acute (U+01FD)
      '    Greek Small Letter Beta (U+03B2)
      '    a high-surrogate value (U+D8FF)
      '    a low-surrogate value (U+DCFF)
      Dim myChars() As Char = {"z"c, "a"c, ChrW(&H0306), ChrW(&H01FD), ChrW(&H03B2), ChrW(&HD8FF), ChrW(&HDCFF) }

      ' Get different encodings.
      Dim u7 As Encoding = Encoding.UTF7
      Dim u8 As Encoding = Encoding.UTF8
      Dim u16LE As Encoding = Encoding.Unicode
      Dim u16BE As Encoding = Encoding.BigEndianUnicode
      Dim u32 As Encoding = Encoding.UTF32

      ' Encode three characters starting at index 4, and print out the counts and the resulting bytes.
      PrintCountsAndBytes(myChars, 4, 3, u7)
      PrintCountsAndBytes(myChars, 4, 3, u8)
      PrintCountsAndBytes(myChars, 4, 3, u16LE)
      PrintCountsAndBytes(myChars, 4, 3, u16BE)
      PrintCountsAndBytes(myChars, 4, 3, u32)

   End Sub


   Public Shared Sub PrintCountsAndBytes(chars() As Char, index As Integer, count As Integer, enc As Encoding)

      ' Display the name of the encoding used.
      Console.Write("{0,-30} :", enc.ToString())

      ' Display the exact byte count.
      Dim iBC As Integer = enc.GetByteCount(chars, index, count)
      Console.Write(" {0,-3}", iBC)

      ' Display the maximum byte count.
      Dim iMBC As Integer = enc.GetMaxByteCount(count)
      Console.Write(" {0,-3} :", iMBC)

      ' Encode the array of chars.
      Dim bytes As Byte() = enc.GetBytes(chars, index, count)

      ' The following is an alternative way to encode the array of chars:
      ' NOTE: In VB.NET, arrays contain one extra element by default.
      '       The following line creates the array with the exact number of elements required.
      ' Dim bytes(iBC - 1) As Byte
      ' enc.GetBytes( chars, index, count, bytes, bytes.GetLowerBound(0) )

      ' Display all the encoded bytes.
      PrintHexBytes(bytes)

   End Sub


   Public Shared Sub PrintHexBytes(bytes() As Byte)

      If bytes Is Nothing OrElse bytes.Length = 0 Then
         Console.WriteLine("<none>")
      Else
         Dim i As Integer
         For i = 0 To bytes.Length - 1
            Console.Write("{0:X2} ", bytes(i))
         Next i
         Console.WriteLine()
      End If

   End Sub

End Class


'This code produces the following output.
'
'System.Text.UTF7Encoding       : 10  11  :2B 41 37 4C 59 2F 39 7A 2F 2D
'System.Text.UTF8Encoding       : 6   12  :CE B2 F1 8F B3 BF
'System.Text.UnicodeEncoding    : 6   8   :B2 03 FF D8 FF DC
'System.Text.UnicodeEncoding    : 6   8   :03 B2 D8 FF DC FF
'System.Text.UTF32Encoding      : 8   16  :B2 03 00 00 FF FC 04 00

Hinweise

Wenn die zu konvertierenden Daten nur in sequenziellen Blöcken (z. B. aus einem Datenstrom gelesene Daten) verfügbar sind oder die Datenmenge so groß ist, dass sie in kleinere Blöcke unterteilt werden muss, sollten Sie die Decoder oder die Encoder von der GetDecoder Methode bzw. methode bereitgestellte Methode bzw. Methode GetEncoder einer abgeleiteten Klasse verwenden.

Die GetByteCount Methode bestimmt, wie viele Byte eine Reihe von Unicode-Zeichen codieren, und die GetBytes Methode führt die tatsächliche Codierung aus. Die Encoding.GetBytes Methode erwartet diskrete Konvertierungen, im Gegensatz zur Encoder.GetBytes Methode, die mehrere Konvertierungen in einem einzelnen Eingabedatenstrom verarbeitet.

Mehrere Versionen von GetByteCount und GetBytes werden unterstützt. Im Folgenden finden Sie einige Programmierüberlegungen für die Verwendung dieser Methoden:

  • Ihre App muss möglicherweise viele Eingabezeichen auf eine Codeseite codieren und die Zeichen mithilfe mehrerer Aufrufe verarbeiten. In diesem Fall müssen Sie wahrscheinlich den Zustand zwischen Aufrufen beibehalten, wobei der Zustand berücksichtigt wird, der Encoder vom verwendeten Objekt beibehalten wird. (Beispielsweise kann eine Zeichensequenz, die Surrogatepaare enthält, mit einem hohen Ersatz enden. Dies Encoder wird daran denken, dass hohe Surrogate so kombiniert werden kann, dass es mit einem niedrigen Ersatz am Anfang eines folgenden Aufrufs kombiniert werden kann. Encoding Kann den Zustand nicht beibehalten, sodass das Zeichen an die EncoderFallback.) gesendet wird.

  • Wenn Ihre App Zeichenfolgeneingaben verarbeitet, sollten Sie die Zeichenfolgenversion von GetBytes.

  • Die Unicode-Zeichenpufferversion ermöglicht GetBytes(Char*, Int32, Byte*, Int32) einige schnelle Techniken, insbesondere bei mehreren Aufrufen, die das Encoder Objekt verwenden oder in vorhandene Puffer einfügen. Bedenken Sie jedoch, dass diese Methodenversion manchmal unsicher ist, da Zeiger erforderlich sind.

  • Wenn Ihre App eine große Datenmenge konvertieren muss, sollte sie den Ausgabepuffer wiederverwenden. In diesem Fall ist die Version, die GetBytes Bytearrays unterstützt, die beste Wahl.

  • Erwägen Sie die Verwendung der Encoder.Convert Methode anstelle von GetByteCount. Die Konvertierungsmethode konvertiert so viele Daten wie möglich und löst eine Ausnahme aus, wenn der Ausgabepuffer zu klein ist. Für die kontinuierliche Codierung eines Datenstroms ist diese Methode häufig die beste Wahl.

Weitere Informationen

Gilt für:

GetBytes(String, Int32, Int32)

Wenn sie in einer abgeleiteten Klasse überschrieben werden, codiert sie in ein Bytearray, das von der angegebenen Zeichenfolge ausgehend von count der angegebenen Zeichenfolge angegeben indexwird.

public:
 cli::array <System::Byte> ^ GetBytes(System::String ^ s, int index, int count);
public byte[] GetBytes(string s, int index, int count);
member this.GetBytes : string * int * int -> byte[]
Public Function GetBytes (s As String, index As Integer, count As Integer) As Byte()

Parameter

s
String

Die Zeichenfolge, die die zu codierenden Zeichen enthält.

index
Int32

Der Index innerhalb der Zeichenfolge, von dem die Codierung gestartet werden soll.

count
Int32

Die Anzahl der zu codierenden Zeichen.

Gibt zurück

Byte[]

Ein Bytearray, das die Ergebnisse der Codierung des angegebenen Zeichensatzes enthält.

Beispiele

Das folgende Beispiel bestimmt die Anzahl der Bytes, die zum Codieren einer Zeichenfolge oder eines Bereichs in der Zeichenfolge erforderlich sind, codiert die Zeichen und zeigt die resultierenden Bytes an.

using System;
using System.Text;

public class SamplesEncoding  {

   public static void Main()  {

      // The characters to encode:
      //    Latin Small Letter Z (U+007A)
      //    Latin Small Letter A (U+0061)
      //    Combining Breve (U+0306)
      //    Latin Small Letter AE With Acute (U+01FD)
      //    Greek Small Letter Beta (U+03B2)
      //    a high-surrogate value (U+D8FF)
      //    a low-surrogate value (U+DCFF)
      String myStr = "za\u0306\u01FD\u03B2\uD8FF\uDCFF";

      // Get different encodings.
      Encoding  u7    = Encoding.UTF7;
      Encoding  u8    = Encoding.UTF8;
      Encoding  u16LE = Encoding.Unicode;
      Encoding  u16BE = Encoding.BigEndianUnicode;
      Encoding  u32   = Encoding.UTF32;

      // Encode the entire string, and print out the counts and the resulting bytes.
      Console.WriteLine( "Encoding the entire string:" );
      PrintCountsAndBytes( myStr, u7 );
      PrintCountsAndBytes( myStr, u8 );
      PrintCountsAndBytes( myStr, u16LE );
      PrintCountsAndBytes( myStr, u16BE );
      PrintCountsAndBytes( myStr, u32 );

      Console.WriteLine();

      // Encode three characters starting at index 4, and print out the counts and the resulting bytes.
      Console.WriteLine( "Encoding the characters from index 4 through 6:" );
      PrintCountsAndBytes( myStr, 4, 3, u7 );
      PrintCountsAndBytes( myStr, 4, 3, u8 );
      PrintCountsAndBytes( myStr, 4, 3, u16LE );
      PrintCountsAndBytes( myStr, 4, 3, u16BE );
      PrintCountsAndBytes( myStr, 4, 3, u32 );
   }

   public static void PrintCountsAndBytes( String s, Encoding enc )  {

      // Display the name of the encoding used.
      Console.Write( "{0,-30} :", enc.ToString() );

      // Display the exact byte count.
      int iBC  = enc.GetByteCount( s );
      Console.Write( " {0,-3}", iBC );

      // Display the maximum byte count.
      int iMBC = enc.GetMaxByteCount( s.Length );
      Console.Write( " {0,-3} :", iMBC );

      // Encode the entire string.
      byte[] bytes = enc.GetBytes( s );

      // Display all the encoded bytes.
      PrintHexBytes( bytes );
   }

   public static void PrintCountsAndBytes( String s, int index, int count, Encoding enc )  {

      // Display the name of the encoding used.
      Console.Write( "{0,-30} :", enc.ToString() );

      // Display the exact byte count.
      int iBC  = enc.GetByteCount( s.ToCharArray(), index, count );
      Console.Write( " {0,-3}", iBC );

      // Display the maximum byte count.
      int iMBC = enc.GetMaxByteCount( count );
      Console.Write( " {0,-3} :", iMBC );

      // Encode a range of characters in the string.
      byte[] bytes = new byte[iBC];
      enc.GetBytes( s, index, count, bytes, bytes.GetLowerBound(0) );

      // Display all the encoded bytes.
      PrintHexBytes( bytes );
   }

   public static void PrintHexBytes( byte[] bytes )  {

      if (( bytes == null ) || ( bytes.Length == 0 ))
        {
            Console.WriteLine( "<none>" );
        }
        else  {
         for ( int i = 0; i < bytes.Length; i++ )
            Console.Write( "{0:X2} ", bytes[i] );
         Console.WriteLine();
      }
   }
}


/* 
This code produces the following output.

Encoding the entire string:
System.Text.UTF7Encoding       : 18  23  :7A 61 2B 41 77 59 42 2F 51 4F 79 32 50 2F 63 2F 77 2D
System.Text.UTF8Encoding       : 12  24  :7A 61 CC 86 C7 BD CE B2 F1 8F B3 BF
System.Text.UnicodeEncoding    : 14  16  :7A 00 61 00 06 03 FD 01 B2 03 FF D8 FF DC
System.Text.UnicodeEncoding    : 14  16  :00 7A 00 61 03 06 01 FD 03 B2 D8 FF DC FF
System.Text.UTF32Encoding      : 24  32  :7A 00 00 00 61 00 00 00 06 03 00 00 FD 01 00 00 B2 03 00 00 FF FC 04 00

Encoding the characters from index 4 through 6:
System.Text.UTF7Encoding       : 10  11  :2B 41 37 4C 59 2F 39 7A 2F 2D
System.Text.UTF8Encoding       : 6   12  :CE B2 F1 8F B3 BF
System.Text.UnicodeEncoding    : 6   8   :B2 03 FF D8 FF DC
System.Text.UnicodeEncoding    : 6   8   :03 B2 D8 FF DC FF
System.Text.UTF32Encoding      : 8   16  :B2 03 00 00 FF FC 04 00

*/
Imports System.Text

Public Class SamplesEncoding   

   Public Shared Sub Main()

      ' The characters to encode:
      '    Latin Small Letter Z (U+007A)
      '    Latin Small Letter A (U+0061)
      '    Combining Breve (U+0306)
      '    Latin Small Letter AE With Acute (U+01FD)
      '    Greek Small Letter Beta (U+03B2)
      '    a high-surrogate value (U+D8FF)
      '    a low-surrogate value (U+DCFF)
      Dim myStr As String = "za" & ChrW(&H0306) & ChrW(&H01FD) & ChrW(&H03B2) & ChrW(&HD8FF) & ChrW(&HDCFF)

      ' Get different encodings.
      Dim u7 As Encoding = Encoding.UTF7
      Dim u8 As Encoding = Encoding.UTF8
      Dim u16LE As Encoding = Encoding.Unicode
      Dim u16BE As Encoding = Encoding.BigEndianUnicode
      Dim u32 As Encoding = Encoding.UTF32

      ' Encode the entire string, and print out the counts and the resulting bytes.
      Console.WriteLine("Encoding the entire string:")
      PrintCountsAndBytes(myStr, u7)
      PrintCountsAndBytes(myStr, u8)
      PrintCountsAndBytes(myStr, u16LE)
      PrintCountsAndBytes(myStr, u16BE)
      PrintCountsAndBytes(myStr, u32)

      Console.WriteLine()

      ' Encode three characters starting at index 4, and print out the counts and the resulting bytes.
      Console.WriteLine("Encoding the characters from index 4 through 6:")
      PrintCountsAndBytes(myStr, 4, 3, u7)
      PrintCountsAndBytes(myStr, 4, 3, u8)
      PrintCountsAndBytes(myStr, 4, 3, u16LE)
      PrintCountsAndBytes(myStr, 4, 3, u16BE)
      PrintCountsAndBytes(myStr, 4, 3, u32)

   End Sub


   Overloads Public Shared Sub PrintCountsAndBytes(s As String, enc As Encoding)

      ' Display the name of the encoding used.
      Console.Write("{0,-30} :", enc.ToString())

      ' Display the exact byte count.
      Dim iBC As Integer = enc.GetByteCount(s)
      Console.Write(" {0,-3}", iBC)

      ' Display the maximum byte count.
      Dim iMBC As Integer = enc.GetMaxByteCount(s.Length)
      Console.Write(" {0,-3} :", iMBC)

      ' Encode the entire string.
      Dim bytes As Byte() = enc.GetBytes(s)

      ' Display all the encoded bytes.
      PrintHexBytes(bytes)

   End Sub


   Overloads Public Shared Sub PrintCountsAndBytes(s As String, index As Integer, count As Integer, enc As Encoding)

      ' Display the name of the encoding used.
      Console.Write("{0,-30} :", enc.ToString())

      ' Display the exact byte count.
      Dim iBC As Integer = enc.GetByteCount(s.ToCharArray(), index, count)
      Console.Write(" {0,-3}", iBC)

      ' Display the maximum byte count.
      Dim iMBC As Integer = enc.GetMaxByteCount(count)
      Console.Write(" {0,-3} :", iMBC)

      ' Encode a range of characters in the string.
      ' NOTE: In VB.NET, arrays contain one extra element by default.
      '       The following line creates the array with the exact number of elements required.
      Dim bytes(iBC - 1) As Byte
      enc.GetBytes(s, index, count, bytes, bytes.GetLowerBound(0))

      ' Display all the encoded bytes.
      PrintHexBytes(bytes)

   End Sub


   Public Shared Sub PrintHexBytes(bytes() As Byte)

      If bytes Is Nothing OrElse bytes.Length = 0 Then
         Console.WriteLine("<none>")
      Else
         Dim i As Integer
         For i = 0 To bytes.Length - 1
            Console.Write("{0:X2} ", bytes(i))
         Next i
         Console.WriteLine()
      End If

   End Sub

End Class


'This code produces the following output.
'
'Encoding the entire string:
'System.Text.UTF7Encoding       : 18  23  :7A 61 2B 41 77 59 42 2F 51 4F 79 32 50 2F 63 2F 77 2D
'System.Text.UTF8Encoding       : 12  24  :7A 61 CC 86 C7 BD CE B2 F1 8F B3 BF
'System.Text.UnicodeEncoding    : 14  16  :7A 00 61 00 06 03 FD 01 B2 03 FF D8 FF DC
'System.Text.UnicodeEncoding    : 14  16  :00 7A 00 61 03 06 01 FD 03 B2 D8 FF DC FF
'System.Text.UTF32Encoding      : 24  32  :7A 00 00 00 61 00 00 00 06 03 00 00 FD 01 00 00 B2 03 00 00 FF FC 04 00
'
'Encoding the characters from index 4 through 6:
'System.Text.UTF7Encoding       : 10  11  :2B 41 37 4C 59 2F 39 7A 2F 2D
'System.Text.UTF8Encoding       : 6   12  :CE B2 F1 8F B3 BF
'System.Text.UnicodeEncoding    : 6   8   :B2 03 FF D8 FF DC
'System.Text.UnicodeEncoding    : 6   8   :03 B2 D8 FF DC FF
'System.Text.UTF32Encoding      : 8   16  :B2 03 00 00 FF FC 04 00

Hinweise

Wenn die zu konvertierenden Daten nur in sequenziellen Blöcken (z. B. aus einem Datenstrom gelesene Daten) verfügbar sind oder die Datenmenge so groß ist, dass sie in kleinere Blöcke unterteilt werden muss, sollten Sie die Decoder oder die Encoder von der GetDecoder Methode bzw. methode bereitgestellte Methode bzw. Methode GetEncoder einer abgeleiteten Klasse verwenden.

Die GetByteCount Methode bestimmt, wie viele Byte eine Reihe von Unicode-Zeichen codieren, und die GetBytes Methode führt die tatsächliche Codierung aus. Die Encoding.GetBytes Methode erwartet diskrete Konvertierungen, im Gegensatz zur Encoder.GetBytes Methode, die mehrere Konvertierungen in einem einzelnen Eingabedatenstrom verarbeitet.

Mehrere Versionen von GetByteCount und GetBytes werden unterstützt. Im Folgenden finden Sie einige Programmierüberlegungen für die Verwendung dieser Methoden:

  • Ihre App muss möglicherweise viele Eingabezeichen auf eine Codeseite codieren und die Zeichen mithilfe mehrerer Aufrufe verarbeiten. In diesem Fall müssen Sie wahrscheinlich den Zustand zwischen Aufrufen beibehalten, wobei der Zustand berücksichtigt wird, der Encoder vom verwendeten Objekt beibehalten wird. (Beispielsweise kann eine Zeichensequenz, die Surrogatepaare enthält, mit einem hohen Ersatz enden. Dies Encoder wird daran denken, dass hohe Surrogate so kombiniert werden kann, dass es mit einem niedrigen Ersatz am Anfang eines folgenden Aufrufs kombiniert werden kann. Encoding Kann den Zustand nicht beibehalten, sodass das Zeichen an die EncoderFallback.) gesendet wird.

  • Wenn Ihre App Zeichenfolgeneingaben verarbeitet, sollten Sie die Zeichenfolgenversion von GetBytes.

  • Die Unicode-Zeichenpufferversion ermöglicht GetBytes(Char*, Int32, Byte*, Int32) einige schnelle Techniken, insbesondere bei mehreren Aufrufen, die das Encoder Objekt verwenden oder in vorhandene Puffer einfügen. Bedenken Sie jedoch, dass diese Methodenversion manchmal unsicher ist, da Zeiger erforderlich sind.

  • Wenn Ihre App eine große Datenmenge konvertieren muss, sollte sie den Ausgabepuffer wiederverwenden. In diesem Fall ist die Version, die GetBytes Bytearrays unterstützt, die beste Wahl.

  • Erwägen Sie die Verwendung der Encoder.Convert Methode anstelle von GetByteCount. Die Konvertierungsmethode konvertiert so viele Daten wie möglich und löst eine Ausnahme aus, wenn der Ausgabepuffer zu klein ist. Für die kontinuierliche Codierung eines Datenstroms ist diese Methode häufig die beste Wahl.

Gilt für:

GetBytes(Char*, Int32, Byte*, Int32)

Wichtig

Diese API ist nicht CLS-kompatibel.

Wenn eine abgeleitete Klasse überschrieben wird, codiert eine Reihe von Zeichen, die am angegebenen Zeichenzeiger beginnen, in eine Abfolge von Bytes, die ab dem angegebenen Bytezeiger gespeichert werden.

public:
 virtual int GetBytes(char* chars, int charCount, System::Byte* bytes, int byteCount);
[System.CLSCompliant(false)]
[System.Security.SecurityCritical]
public virtual int GetBytes(char* chars, int charCount, byte* bytes, int byteCount);
[System.CLSCompliant(false)]
[System.Runtime.InteropServices.ComVisible(false)]
public virtual int GetBytes(char* chars, int charCount, byte* bytes, int byteCount);
[System.CLSCompliant(false)]
[System.Security.SecurityCritical]
[System.Runtime.InteropServices.ComVisible(false)]
public virtual int GetBytes(char* chars, int charCount, byte* bytes, int byteCount);
[System.CLSCompliant(false)]
public virtual int GetBytes(char* chars, int charCount, byte* bytes, int byteCount);
[<System.CLSCompliant(false)>]
[<System.Security.SecurityCritical>]
abstract member GetBytes : nativeptr<char> * int * nativeptr<byte> * int -> int
override this.GetBytes : nativeptr<char> * int * nativeptr<byte> * int -> int
[<System.CLSCompliant(false)>]
[<System.Runtime.InteropServices.ComVisible(false)>]
abstract member GetBytes : nativeptr<char> * int * nativeptr<byte> * int -> int
override this.GetBytes : nativeptr<char> * int * nativeptr<byte> * int -> int
[<System.CLSCompliant(false)>]
[<System.Security.SecurityCritical>]
[<System.Runtime.InteropServices.ComVisible(false)>]
abstract member GetBytes : nativeptr<char> * int * nativeptr<byte> * int -> int
override this.GetBytes : nativeptr<char> * int * nativeptr<byte> * int -> int
[<System.CLSCompliant(false)>]
abstract member GetBytes : nativeptr<char> * int * nativeptr<byte> * int -> int
override this.GetBytes : nativeptr<char> * int * nativeptr<byte> * int -> int

Parameter

chars
Char*

Ein Zeiger auf das erste zeichen, das codiert werden soll.

charCount
Int32

Die Anzahl der zu codierenden Zeichen.

bytes
Byte*

Ein Zeiger auf die Position, an der die resultierende Folge von Bytes geschrieben werden soll.

byteCount
Int32

Die maximale Anzahl von Bytes, die geschrieben werden sollen.

Gibt zurück

Die tatsächliche Anzahl von Bytes, die an der position geschrieben wurden, die durch den bytes Parameter angegeben wurde.

Attribute

Ausnahmen

chars ist null.

-oder-

bytes ist null.

charCount oder byteCount ist kleiner als Null.

byteCount ist kleiner als die resultierende Anzahl von Bytes.

Ein Fallback ist aufgetreten (weitere Informationen finden Sie unter "Zeichencodierung in .NET")

-und-

EncoderFallback ist auf EncoderExceptionFallback festgelegt.

Hinweise

Rufen Sie die Methode auf, um die genaue Arraygröße zu berechnen, GetBytes die zum Speichern der GetByteCount resultierenden Bytes erforderlich ist. Rufen Sie die Methode auf, um die GetMaxByteCount maximale Arraygröße zu berechnen. Die GetByteCount Methode ermöglicht in der Regel die Zuordnung von weniger Arbeitsspeicher, während die GetMaxByteCount Methode im Allgemeinen schneller ausgeführt wird.

Wenn die zu konvertierenden Daten nur in sequenziellen Blöcken (z. B. aus einem Datenstrom gelesene Daten) verfügbar sind oder die Datenmenge so groß ist, dass sie in kleinere Blöcke unterteilt werden muss, sollten Sie das Decoder oder das objekt verwenden, das bzw. das Encoder von der GetDecoder oder der GetEncoder Methode bereitgestellte Objekt einer abgeleiteten Klasse ist.

Die GetByteCount Methode bestimmt, wie viele Byte eine Reihe von Unicode-Zeichen codieren, und die GetBytes Methode führt die tatsächliche Codierung aus. Die GetBytes Methode erwartet diskrete Konvertierungen, im Gegensatz zur Encoder.GetBytes Methode, die mehrere Konvertierungen in einem einzelnen Eingabedatenstrom verarbeitet.

Mehrere Versionen von GetByteCount und GetBytes werden unterstützt. Im Folgenden finden Sie einige Programmierüberlegungen für die Verwendung dieser Methoden:

  • Ihre App muss möglicherweise viele Eingabezeichen auf eine Codeseite codieren und die Zeichen mithilfe mehrerer Aufrufe verarbeiten. In diesem Fall müssen Sie wahrscheinlich den Zustand zwischen Aufrufen beibehalten, wobei der Zustand berücksichtigt wird, der Encoder vom verwendeten Objekt beibehalten wird. (Beispielsweise kann eine Zeichensequenz, die Surrogatepaare enthält, mit einem hohen Ersatz enden. Dies Encoder wird daran denken, dass hohe Surrogate so kombiniert werden kann, dass es mit einem niedrigen Ersatz am Anfang eines folgenden Aufrufs kombiniert werden kann. Encoding Kann den Zustand nicht beibehalten, sodass das Zeichen an die EncoderFallback.) gesendet wird.

  • Wenn Ihre App Zeichenfolgeneingaben verarbeitet, sollten Sie die Zeichenfolgenversion von GetBytes.

  • Die Unicode-Zeichenpufferversion ermöglicht GetBytes(Char*, Int32, Byte*, Int32) einige schnelle Techniken, insbesondere bei mehreren Aufrufen, die das Encoder Objekt verwenden oder in vorhandene Puffer einfügen. Bedenken Sie jedoch, dass diese Methodenversion manchmal unsicher ist, da Zeiger erforderlich sind.

  • Wenn Ihre App eine große Datenmenge konvertieren muss, sollte sie den Ausgabepuffer wiederverwenden. In diesem Fall ist die Version, die GetBytes Bytearrays unterstützt, die beste Wahl.

  • Erwägen Sie die Verwendung der Encoder.Convert Methode anstelle von GetByteCount. Die Konvertierungsmethode konvertiert so viele Daten wie möglich und löst eine Ausnahme aus, wenn der Ausgabepuffer zu klein ist. Für die kontinuierliche Codierung eines Datenstroms ist diese Methode häufig die beste Wahl.

Weitere Informationen

Gilt für:

GetBytes(Char[], Int32, Int32, Byte[], Int32)

Wenn eine abgeleitete Klasse überschrieben wird, codiert eine Reihe von Zeichen aus dem angegebenen Zeichenarray in das angegebene Bytearray.

public:
 abstract int GetBytes(cli::array <char> ^ chars, int charIndex, int charCount, cli::array <System::Byte> ^ bytes, int byteIndex);
public abstract int GetBytes(char[] chars, int charIndex, int charCount, byte[] bytes, int byteIndex);
abstract member GetBytes : char[] * int * int * byte[] * int -> int
Public MustOverride Function GetBytes (chars As Char(), charIndex As Integer, charCount As Integer, bytes As Byte(), byteIndex As Integer) As Integer

Parameter

chars
Char[]

Das Zeichenarray, das die zu codierenden Zeichensätze enthält.

charIndex
Int32

Der Index des ersten zu codierenden Zeichens.

charCount
Int32

Die Anzahl der zu codierenden Zeichen.

bytes
Byte[]

Das Bytearray, das die resultierende Folge von Bytes enthält.

byteIndex
Int32

Der Index, bei dem mit dem Schreiben der resultierenden Bytesequenz begonnen werden soll.

Gibt zurück

Die tatsächliche Anzahl der in bytes.

Ausnahmen

chars ist null.

-oder-

bytes ist null.

charIndex oder charCountbyteIndex ist kleiner als Null.

-oder-

charIndex und charCount keinen gültigen Bereich in chars.

-oder-

byteIndex ist kein gültiger Index in bytes.

bytes verfügt nicht über genügend Kapazität vom byteIndex Ende des Arrays, um die resultierenden Bytes aufzunehmen.

Ein Fallback ist aufgetreten (weitere Informationen finden Sie unter "Zeichencodierung in .NET")

-und-

EncoderFallback ist auf EncoderExceptionFallback festgelegt.

Beispiele

Im folgenden Beispiel wird die Anzahl der Bytes bestimmt, die erforderlich sind, um drei Zeichen aus einem Zeichenarray zu codieren, die Zeichen zu codieren und die resultierenden Bytes anzuzeigen.

using System;
using System.Text;

public class SamplesEncoding  {

   public static void Main()  {

      // The characters to encode:
      //    Latin Small Letter Z (U+007A)
      //    Latin Small Letter A (U+0061)
      //    Combining Breve (U+0306)
      //    Latin Small Letter AE With Acute (U+01FD)
      //    Greek Small Letter Beta (U+03B2)
      //    a high-surrogate value (U+D8FF)
      //    a low-surrogate value (U+DCFF)
      char[] myChars = new char[] { 'z', 'a', '\u0306', '\u01FD', '\u03B2', '\uD8FF', '\uDCFF' };

      // Get different encodings.
      Encoding  u7    = Encoding.UTF7;
      Encoding  u8    = Encoding.UTF8;
      Encoding  u16LE = Encoding.Unicode;
      Encoding  u16BE = Encoding.BigEndianUnicode;
      Encoding  u32   = Encoding.UTF32;

      // Encode three characters starting at index 4, and print out the counts and the resulting bytes.
      PrintCountsAndBytes( myChars, 4, 3, u7 );
      PrintCountsAndBytes( myChars, 4, 3, u8 );
      PrintCountsAndBytes( myChars, 4, 3, u16LE );
      PrintCountsAndBytes( myChars, 4, 3, u16BE );
      PrintCountsAndBytes( myChars, 4, 3, u32 );
   }

   public static void PrintCountsAndBytes( char[] chars, int index, int count, Encoding enc )  {

      // Display the name of the encoding used.
      Console.Write( "{0,-30} :", enc.ToString() );

      // Display the exact byte count.
      int iBC  = enc.GetByteCount( chars, index, count );
      Console.Write( " {0,-3}", iBC );

      // Display the maximum byte count.
      int iMBC = enc.GetMaxByteCount( count );
      Console.Write( " {0,-3} :", iMBC );

      // Encode the array of chars.
      byte[] bytes = enc.GetBytes( chars, index, count );

      // The following is an alternative way to encode the array of chars:
      // byte[] bytes = new byte[iBC];
      // enc.GetBytes( chars, index, count, bytes, bytes.GetLowerBound(0) );

      // Display all the encoded bytes.
      PrintHexBytes( bytes );
   }

   public static void PrintHexBytes( byte[] bytes )  {

      if (( bytes == null ) || ( bytes.Length == 0 ))
        {
            Console.WriteLine( "<none>" );
        }
        else  {
         for ( int i = 0; i < bytes.Length; i++ )
            Console.Write( "{0:X2} ", bytes[i] );
         Console.WriteLine();
      }
   }
}


/* 
This code produces the following output.

System.Text.UTF7Encoding       : 10  11  :2B 41 37 4C 59 2F 39 7A 2F 2D
System.Text.UTF8Encoding       : 6   12  :CE B2 F1 8F B3 BF
System.Text.UnicodeEncoding    : 6   8   :B2 03 FF D8 FF DC
System.Text.UnicodeEncoding    : 6   8   :03 B2 D8 FF DC FF
System.Text.UTF32Encoding      : 8   16  :B2 03 00 00 FF FC 04 00

*/
Imports System.Text

Public Class SamplesEncoding   

   Public Shared Sub Main()

      ' The characters to encode:
      '    Latin Small Letter Z (U+007A)
      '    Latin Small Letter A (U+0061)
      '    Combining Breve (U+0306)
      '    Latin Small Letter AE With Acute (U+01FD)
      '    Greek Small Letter Beta (U+03B2)
      '    a high-surrogate value (U+D8FF)
      '    a low-surrogate value (U+DCFF)
      Dim myChars() As Char = {"z"c, "a"c, ChrW(&H0306), ChrW(&H01FD), ChrW(&H03B2), ChrW(&HD8FF), ChrW(&HDCFF) }

      ' Get different encodings.
      Dim u7 As Encoding = Encoding.UTF7
      Dim u8 As Encoding = Encoding.UTF8
      Dim u16LE As Encoding = Encoding.Unicode
      Dim u16BE As Encoding = Encoding.BigEndianUnicode
      Dim u32 As Encoding = Encoding.UTF32

      ' Encode three characters starting at index 4, and print out the counts and the resulting bytes.
      PrintCountsAndBytes(myChars, 4, 3, u7)
      PrintCountsAndBytes(myChars, 4, 3, u8)
      PrintCountsAndBytes(myChars, 4, 3, u16LE)
      PrintCountsAndBytes(myChars, 4, 3, u16BE)
      PrintCountsAndBytes(myChars, 4, 3, u32)

   End Sub


   Public Shared Sub PrintCountsAndBytes(chars() As Char, index As Integer, count As Integer, enc As Encoding)

      ' Display the name of the encoding used.
      Console.Write("{0,-30} :", enc.ToString())

      ' Display the exact byte count.
      Dim iBC As Integer = enc.GetByteCount(chars, index, count)
      Console.Write(" {0,-3}", iBC)

      ' Display the maximum byte count.
      Dim iMBC As Integer = enc.GetMaxByteCount(count)
      Console.Write(" {0,-3} :", iMBC)

      ' Encode the array of chars.
      Dim bytes As Byte() = enc.GetBytes(chars, index, count)

      ' The following is an alternative way to encode the array of chars:
      ' NOTE: In VB.NET, arrays contain one extra element by default.
      '       The following line creates the array with the exact number of elements required.
      ' Dim bytes(iBC - 1) As Byte
      ' enc.GetBytes( chars, index, count, bytes, bytes.GetLowerBound(0) )

      ' Display all the encoded bytes.
      PrintHexBytes(bytes)

   End Sub


   Public Shared Sub PrintHexBytes(bytes() As Byte)

      If bytes Is Nothing OrElse bytes.Length = 0 Then
         Console.WriteLine("<none>")
      Else
         Dim i As Integer
         For i = 0 To bytes.Length - 1
            Console.Write("{0:X2} ", bytes(i))
         Next i
         Console.WriteLine()
      End If

   End Sub

End Class


'This code produces the following output.
'
'System.Text.UTF7Encoding       : 10  11  :2B 41 37 4C 59 2F 39 7A 2F 2D
'System.Text.UTF8Encoding       : 6   12  :CE B2 F1 8F B3 BF
'System.Text.UnicodeEncoding    : 6   8   :B2 03 FF D8 FF DC
'System.Text.UnicodeEncoding    : 6   8   :03 B2 D8 FF DC FF
'System.Text.UTF32Encoding      : 8   16  :B2 03 00 00 FF FC 04 00

Hinweise

Um die genaue Arraygröße zu berechnen, die zum GetBytes Speichern der resultierenden Bytes erforderlich ist, sollten Sie die GetByteCount Methode aufrufen. Rufen Sie die Methode auf, um die GetMaxByteCount maximale Arraygröße zu berechnen. Die GetByteCount Methode ermöglicht in der Regel die Zuordnung von weniger Arbeitsspeicher, während die GetMaxByteCount Methode im Allgemeinen schneller ausgeführt wird.

Wenn die zu konvertierenden Daten nur in sequenziellen Blöcken (z. B. aus einem Datenstrom gelesene Daten) verfügbar sind oder die Datenmenge so groß ist, dass sie in kleinere Blöcke unterteilt werden muss, sollten Sie die Decoder oder die Encoder von der GetDecoder Methode bzw. methode bereitgestellte Methode bzw. Methode GetEncoder einer abgeleiteten Klasse verwenden.

Die GetByteCount Methode bestimmt, wie viele Byte eine Reihe von Unicode-Zeichen codieren, und die GetBytes Methode führt die tatsächliche Codierung aus. Die Encoding.GetBytes Methode erwartet diskrete Konvertierungen, im Gegensatz zur Encoder.GetBytes Methode, die mehrere Konvertierungen in einem einzelnen Eingabedatenstrom verarbeitet.

Mehrere Versionen von GetByteCount und GetBytes werden unterstützt. Im Folgenden finden Sie einige Programmierüberlegungen für die Verwendung dieser Methoden:

  • Ihre App muss möglicherweise viele Eingabezeichen auf eine Codeseite codieren und die Zeichen mithilfe mehrerer Aufrufe verarbeiten. In diesem Fall müssen Sie wahrscheinlich den Zustand zwischen Aufrufen beibehalten, wobei der Zustand berücksichtigt wird, der Encoder vom verwendeten Objekt beibehalten wird. (Beispielsweise kann eine Zeichensequenz, die Surrogatepaare enthält, mit einem hohen Ersatz enden. Dies Encoder wird daran denken, dass hohe Surrogate so kombiniert werden kann, dass es mit einem niedrigen Ersatz am Anfang eines folgenden Aufrufs kombiniert werden kann. Encoding Kann den Zustand nicht beibehalten, sodass das Zeichen an die EncoderFallback.) gesendet wird.

  • Wenn Ihre App Zeichenfolgeneingaben verarbeitet, sollten Sie die Zeichenfolgenversion von GetBytes.

  • Die Unicode-Zeichenpufferversion ermöglicht GetBytes(Char*, Int32, Byte*, Int32) einige schnelle Techniken, insbesondere bei mehreren Aufrufen, die das Encoder Objekt verwenden oder in vorhandene Puffer einfügen. Bedenken Sie jedoch, dass diese Methodenversion manchmal unsicher ist, da Zeiger erforderlich sind.

  • Wenn Ihre App eine große Datenmenge konvertieren muss, sollte sie den Ausgabepuffer wiederverwenden. In diesem Fall ist die Version, die GetBytes Bytearrays unterstützt, die beste Wahl.

  • Erwägen Sie die Verwendung der Encoder.Convert Methode anstelle von GetByteCount. Die Konvertierungsmethode konvertiert so viele Daten wie möglich und löst eine Ausnahme aus, wenn der Ausgabepuffer zu klein ist. Für die kontinuierliche Codierung eines Datenstroms ist diese Methode häufig die beste Wahl.

Weitere Informationen

Gilt für:

GetBytes(String, Int32, Int32, Byte[], Int32)

Wenn eine abgeleitete Klasse überschrieben wird, codiert eine Reihe von Zeichen aus der angegebenen Zeichenfolge in das angegebene Bytearray.

public:
 virtual int GetBytes(System::String ^ s, int charIndex, int charCount, cli::array <System::Byte> ^ bytes, int byteIndex);
public virtual int GetBytes(string s, int charIndex, int charCount, byte[] bytes, int byteIndex);
abstract member GetBytes : string * int * int * byte[] * int -> int
override this.GetBytes : string * int * int * byte[] * int -> int
Public Overridable Function GetBytes (s As String, charIndex As Integer, charCount As Integer, bytes As Byte(), byteIndex As Integer) As Integer

Parameter

s
String

Die Zeichenfolge, die die zu codierenden Zeichensätze enthält.

charIndex
Int32

Der Index des ersten zu codierenden Zeichens.

charCount
Int32

Die Anzahl der zu codierenden Zeichen.

bytes
Byte[]

Das Bytearray, das die resultierende Folge von Bytes enthält.

byteIndex
Int32

Der Index, bei dem mit dem Schreiben der resultierenden Bytesequenz begonnen werden soll.

Gibt zurück

Die tatsächliche Anzahl der in bytes.

Ausnahmen

s ist null.

-oder-

bytes ist null.

charIndex oder charCountbyteIndex ist kleiner als Null.

-oder-

charIndex und charCount keinen gültigen Bereich in s.

-oder-

byteIndex ist kein gültiger Index in bytes.

bytes verfügt nicht über genügend Kapazität vom byteIndex Ende des Arrays, um die resultierenden Bytes aufzunehmen.

Ein Fallback ist aufgetreten (weitere Informationen finden Sie unter "Zeichencodierung in .NET")

-und-

EncoderFallback ist auf EncoderExceptionFallback festgelegt.

Beispiele

Das folgende Beispiel bestimmt die Anzahl der Bytes, die zum Codieren einer Zeichenfolge oder eines Bereichs in der Zeichenfolge erforderlich sind, codiert die Zeichen und zeigt die resultierenden Bytes an.

using System;
using System.Text;

public class SamplesEncoding  {

   public static void Main()  {

      // The characters to encode:
      //    Latin Small Letter Z (U+007A)
      //    Latin Small Letter A (U+0061)
      //    Combining Breve (U+0306)
      //    Latin Small Letter AE With Acute (U+01FD)
      //    Greek Small Letter Beta (U+03B2)
      //    a high-surrogate value (U+D8FF)
      //    a low-surrogate value (U+DCFF)
      String myStr = "za\u0306\u01FD\u03B2\uD8FF\uDCFF";

      // Get different encodings.
      Encoding  u7    = Encoding.UTF7;
      Encoding  u8    = Encoding.UTF8;
      Encoding  u16LE = Encoding.Unicode;
      Encoding  u16BE = Encoding.BigEndianUnicode;
      Encoding  u32   = Encoding.UTF32;

      // Encode the entire string, and print out the counts and the resulting bytes.
      Console.WriteLine( "Encoding the entire string:" );
      PrintCountsAndBytes( myStr, u7 );
      PrintCountsAndBytes( myStr, u8 );
      PrintCountsAndBytes( myStr, u16LE );
      PrintCountsAndBytes( myStr, u16BE );
      PrintCountsAndBytes( myStr, u32 );

      Console.WriteLine();

      // Encode three characters starting at index 4, and print out the counts and the resulting bytes.
      Console.WriteLine( "Encoding the characters from index 4 through 6:" );
      PrintCountsAndBytes( myStr, 4, 3, u7 );
      PrintCountsAndBytes( myStr, 4, 3, u8 );
      PrintCountsAndBytes( myStr, 4, 3, u16LE );
      PrintCountsAndBytes( myStr, 4, 3, u16BE );
      PrintCountsAndBytes( myStr, 4, 3, u32 );
   }

   public static void PrintCountsAndBytes( String s, Encoding enc )  {

      // Display the name of the encoding used.
      Console.Write( "{0,-30} :", enc.ToString() );

      // Display the exact byte count.
      int iBC  = enc.GetByteCount( s );
      Console.Write( " {0,-3}", iBC );

      // Display the maximum byte count.
      int iMBC = enc.GetMaxByteCount( s.Length );
      Console.Write( " {0,-3} :", iMBC );

      // Encode the entire string.
      byte[] bytes = enc.GetBytes( s );

      // Display all the encoded bytes.
      PrintHexBytes( bytes );
   }

   public static void PrintCountsAndBytes( String s, int index, int count, Encoding enc )  {

      // Display the name of the encoding used.
      Console.Write( "{0,-30} :", enc.ToString() );

      // Display the exact byte count.
      int iBC  = enc.GetByteCount( s.ToCharArray(), index, count );
      Console.Write( " {0,-3}", iBC );

      // Display the maximum byte count.
      int iMBC = enc.GetMaxByteCount( count );
      Console.Write( " {0,-3} :", iMBC );

      // Encode a range of characters in the string.
      byte[] bytes = new byte[iBC];
      enc.GetBytes( s, index, count, bytes, bytes.GetLowerBound(0) );

      // Display all the encoded bytes.
      PrintHexBytes( bytes );
   }

   public static void PrintHexBytes( byte[] bytes )  {

      if (( bytes == null ) || ( bytes.Length == 0 ))
        {
            Console.WriteLine( "<none>" );
        }
        else  {
         for ( int i = 0; i < bytes.Length; i++ )
            Console.Write( "{0:X2} ", bytes[i] );
         Console.WriteLine();
      }
   }
}


/* 
This code produces the following output.

Encoding the entire string:
System.Text.UTF7Encoding       : 18  23  :7A 61 2B 41 77 59 42 2F 51 4F 79 32 50 2F 63 2F 77 2D
System.Text.UTF8Encoding       : 12  24  :7A 61 CC 86 C7 BD CE B2 F1 8F B3 BF
System.Text.UnicodeEncoding    : 14  16  :7A 00 61 00 06 03 FD 01 B2 03 FF D8 FF DC
System.Text.UnicodeEncoding    : 14  16  :00 7A 00 61 03 06 01 FD 03 B2 D8 FF DC FF
System.Text.UTF32Encoding      : 24  32  :7A 00 00 00 61 00 00 00 06 03 00 00 FD 01 00 00 B2 03 00 00 FF FC 04 00

Encoding the characters from index 4 through 6:
System.Text.UTF7Encoding       : 10  11  :2B 41 37 4C 59 2F 39 7A 2F 2D
System.Text.UTF8Encoding       : 6   12  :CE B2 F1 8F B3 BF
System.Text.UnicodeEncoding    : 6   8   :B2 03 FF D8 FF DC
System.Text.UnicodeEncoding    : 6   8   :03 B2 D8 FF DC FF
System.Text.UTF32Encoding      : 8   16  :B2 03 00 00 FF FC 04 00

*/
Imports System.Text

Public Class SamplesEncoding   

   Public Shared Sub Main()

      ' The characters to encode:
      '    Latin Small Letter Z (U+007A)
      '    Latin Small Letter A (U+0061)
      '    Combining Breve (U+0306)
      '    Latin Small Letter AE With Acute (U+01FD)
      '    Greek Small Letter Beta (U+03B2)
      '    a high-surrogate value (U+D8FF)
      '    a low-surrogate value (U+DCFF)
      Dim myStr As String = "za" & ChrW(&H0306) & ChrW(&H01FD) & ChrW(&H03B2) & ChrW(&HD8FF) & ChrW(&HDCFF)

      ' Get different encodings.
      Dim u7 As Encoding = Encoding.UTF7
      Dim u8 As Encoding = Encoding.UTF8
      Dim u16LE As Encoding = Encoding.Unicode
      Dim u16BE As Encoding = Encoding.BigEndianUnicode
      Dim u32 As Encoding = Encoding.UTF32

      ' Encode the entire string, and print out the counts and the resulting bytes.
      Console.WriteLine("Encoding the entire string:")
      PrintCountsAndBytes(myStr, u7)
      PrintCountsAndBytes(myStr, u8)
      PrintCountsAndBytes(myStr, u16LE)
      PrintCountsAndBytes(myStr, u16BE)
      PrintCountsAndBytes(myStr, u32)

      Console.WriteLine()

      ' Encode three characters starting at index 4, and print out the counts and the resulting bytes.
      Console.WriteLine("Encoding the characters from index 4 through 6:")
      PrintCountsAndBytes(myStr, 4, 3, u7)
      PrintCountsAndBytes(myStr, 4, 3, u8)
      PrintCountsAndBytes(myStr, 4, 3, u16LE)
      PrintCountsAndBytes(myStr, 4, 3, u16BE)
      PrintCountsAndBytes(myStr, 4, 3, u32)

   End Sub


   Overloads Public Shared Sub PrintCountsAndBytes(s As String, enc As Encoding)

      ' Display the name of the encoding used.
      Console.Write("{0,-30} :", enc.ToString())

      ' Display the exact byte count.
      Dim iBC As Integer = enc.GetByteCount(s)
      Console.Write(" {0,-3}", iBC)

      ' Display the maximum byte count.
      Dim iMBC As Integer = enc.GetMaxByteCount(s.Length)
      Console.Write(" {0,-3} :", iMBC)

      ' Encode the entire string.
      Dim bytes As Byte() = enc.GetBytes(s)

      ' Display all the encoded bytes.
      PrintHexBytes(bytes)

   End Sub


   Overloads Public Shared Sub PrintCountsAndBytes(s As String, index As Integer, count As Integer, enc As Encoding)

      ' Display the name of the encoding used.
      Console.Write("{0,-30} :", enc.ToString())

      ' Display the exact byte count.
      Dim iBC As Integer = enc.GetByteCount(s.ToCharArray(), index, count)
      Console.Write(" {0,-3}", iBC)

      ' Display the maximum byte count.
      Dim iMBC As Integer = enc.GetMaxByteCount(count)
      Console.Write(" {0,-3} :", iMBC)

      ' Encode a range of characters in the string.
      ' NOTE: In VB.NET, arrays contain one extra element by default.
      '       The following line creates the array with the exact number of elements required.
      Dim bytes(iBC - 1) As Byte
      enc.GetBytes(s, index, count, bytes, bytes.GetLowerBound(0))

      ' Display all the encoded bytes.
      PrintHexBytes(bytes)

   End Sub


   Public Shared Sub PrintHexBytes(bytes() As Byte)

      If bytes Is Nothing OrElse bytes.Length = 0 Then
         Console.WriteLine("<none>")
      Else
         Dim i As Integer
         For i = 0 To bytes.Length - 1
            Console.Write("{0:X2} ", bytes(i))
         Next i
         Console.WriteLine()
      End If

   End Sub

End Class


'This code produces the following output.
'
'Encoding the entire string:
'System.Text.UTF7Encoding       : 18  23  :7A 61 2B 41 77 59 42 2F 51 4F 79 32 50 2F 63 2F 77 2D
'System.Text.UTF8Encoding       : 12  24  :7A 61 CC 86 C7 BD CE B2 F1 8F B3 BF
'System.Text.UnicodeEncoding    : 14  16  :7A 00 61 00 06 03 FD 01 B2 03 FF D8 FF DC
'System.Text.UnicodeEncoding    : 14  16  :00 7A 00 61 03 06 01 FD 03 B2 D8 FF DC FF
'System.Text.UTF32Encoding      : 24  32  :7A 00 00 00 61 00 00 00 06 03 00 00 FD 01 00 00 B2 03 00 00 FF FC 04 00
'
'Encoding the characters from index 4 through 6:
'System.Text.UTF7Encoding       : 10  11  :2B 41 37 4C 59 2F 39 7A 2F 2D
'System.Text.UTF8Encoding       : 6   12  :CE B2 F1 8F B3 BF
'System.Text.UnicodeEncoding    : 6   8   :B2 03 FF D8 FF DC
'System.Text.UnicodeEncoding    : 6   8   :03 B2 D8 FF DC FF
'System.Text.UTF32Encoding      : 8   16  :B2 03 00 00 FF FC 04 00

Hinweise

Um die genaue Arraygröße zu berechnen, die zum GetBytes Speichern der resultierenden Bytes erforderlich ist, sollten Sie die GetByteCount Methode aufrufen. Rufen Sie die Methode auf, um die GetMaxByteCount maximale Arraygröße zu berechnen. Die GetByteCount Methode ermöglicht in der Regel die Zuordnung von weniger Arbeitsspeicher, während die GetMaxByteCount Methode im Allgemeinen schneller ausgeführt wird.

Wenn die zu konvertierenden Daten nur in sequenziellen Blöcken (z. B. aus einem Datenstrom gelesene Daten) verfügbar sind oder die Datenmenge so groß ist, dass sie in kleinere Blöcke unterteilt werden muss, sollten Sie die Decoder oder die Encoder von der GetDecoder Methode bzw. methode bereitgestellte Methode bzw. Methode GetEncoder einer abgeleiteten Klasse verwenden.

Die GetByteCount Methode bestimmt, wie viele Byte eine Reihe von Unicode-Zeichen codieren, und die GetBytes Methode führt die tatsächliche Codierung aus. Die Encoding.GetBytes Methode erwartet diskrete Konvertierungen, im Gegensatz zur Encoder.GetBytes Methode, die mehrere Konvertierungen in einem einzelnen Eingabedatenstrom verarbeitet.

Mehrere Versionen von GetByteCount und GetBytes werden unterstützt. Im Folgenden finden Sie einige Programmierüberlegungen für die Verwendung dieser Methoden:

  • Ihre App muss möglicherweise viele Eingabezeichen auf eine Codeseite codieren und die Zeichen mithilfe mehrerer Aufrufe verarbeiten. In diesem Fall müssen Sie wahrscheinlich den Zustand zwischen Aufrufen beibehalten, wobei der Zustand berücksichtigt wird, der Encoder vom verwendeten Objekt beibehalten wird. (Beispielsweise kann eine Zeichensequenz, die Surrogatepaare enthält, mit einem hohen Ersatz enden. Dies Encoder wird daran denken, dass hohe Surrogate so kombiniert werden kann, dass es mit einem niedrigen Ersatz am Anfang eines folgenden Aufrufs kombiniert werden kann. Encoding Kann den Zustand nicht beibehalten, sodass das Zeichen an die EncoderFallback.) gesendet wird.

  • Wenn Ihre App Zeichenfolgeneingaben verarbeitet, sollten Sie die Zeichenfolgenversion von GetBytes.

  • Die Unicode-Zeichenpufferversion ermöglicht GetBytes(Char*, Int32, Byte*, Int32) einige schnelle Techniken, insbesondere bei mehreren Aufrufen, die das Encoder Objekt verwenden oder in vorhandene Puffer einfügen. Bedenken Sie jedoch, dass diese Methodenversion manchmal unsicher ist, da Zeiger erforderlich sind.

  • Wenn Ihre App eine große Datenmenge konvertieren muss, sollte sie den Ausgabepuffer wiederverwenden. In diesem Fall ist die Version, die GetBytes Bytearrays unterstützt, die beste Wahl.

  • Erwägen Sie die Verwendung der Encoder.Convert Methode anstelle von GetByteCount. Die Konvertierungsmethode konvertiert so viele Daten wie möglich und löst eine Ausnahme aus, wenn der Ausgabepuffer zu klein ist. Für die kontinuierliche Codierung eines Datenstroms ist diese Methode häufig die beste Wahl.

Weitere Informationen

Gilt für: