Leggere in inglese

Condividi tramite


Encoding.GetBytes Metodo

Definizione

Quando ne viene eseguito l'override in una classe derivata, codifica un set di caratteri in una sequenza di byte.

Overload

GetBytes(Char[])

Quando ne viene eseguito l'override in una classe derivata, codifica tutti i caratteri nella matrice di caratteri specificata in una sequenza di byte.

GetBytes(String)

Quando ne viene eseguito l'override in una classe derivata, codifica tutti i caratteri nella stringa specificata in una sequenza di byte.

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

Quando ne viene eseguito l'override in una classe derivata, codifica un set di caratteri dall'intervallo di sola lettura specificato in un intervallo di byte.

GetBytes(Char[], Int32, Int32)

Quando ne viene eseguito l'override in una classe derivata, codifica un set di caratteri dalla matrice di caratteri specificata in una sequenza di byte.

GetBytes(String, Int32, Int32)

Quando ne viene eseguito l'override in una classe derivata, codifica in una matrice di byte il numero di caratteri specificato da count nella stringa specificata, a partire dal valore di index specificato.

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

Quando ne viene eseguito l'override in una classe derivata, codifica un set di caratteri a partire dal puntatore ai caratteri specificato in una sequenza di byte archiviati a partire dal puntatore ai byte specificato.

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

Quando ne viene eseguito l'override in una classe derivata, codifica un set di caratteri dalla matrice di caratteri specificata nella matrice di byte specificata.

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

Quando ne viene eseguito l'override in una classe derivata, codifica un set di caratteri dalla stringa specificata nella matrice di byte specificata.

GetBytes(Char[])

Origine:
Encoding.cs
Origine:
Encoding.cs
Origine:
Encoding.cs

Quando ne viene eseguito l'override in una classe derivata, codifica tutti i caratteri nella matrice di caratteri specificata in una sequenza di byte.

public virtual byte[] GetBytes (char[] chars);

Parametri

chars
Char[]

Matrice di caratteri contenente i caratteri da codificare.

Restituisce

Byte[]

Matrice di byte contenente i risultati della codifica del set di caratteri specificato.

Eccezioni

chars è null.

Si è verificato un fallback (per altre informazioni, vedere Codifica dei caratteri in .NET)

-e-

EncoderFallback è impostato su EncoderExceptionFallback.

Esempio

Nell'esempio seguente viene determinato il numero di byte necessari per codificare una matrice di caratteri, vengono codificati i caratteri e vengono visualizzati i byte risultanti.

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

*/

Commenti

Se i dati da convertire sono disponibili solo in blocchi sequenziali, ad esempio i dati letti da un flusso, o se la quantità di dati è talmente grande da poter essere divisa in blocchi più piccoli, è necessario usare Decoder o rispettivamente il Encoder metodo o fornito dal GetDecoder metodo o il GetEncoder metodo di una classe derivata.

Il GetByteCount metodo determina il numero di byte che comportano la codifica di un set di caratteri Unicode e il GetBytes metodo esegue la codifica effettiva. Il GetBytes metodo prevede conversioni discrete, a differenza del Encoder.GetBytes metodo, che gestisce più conversioni in un singolo flusso di input.

Sono supportate diverse versioni di GetByteCount e GetBytes . Di seguito sono riportate alcune considerazioni di programmazione per l'utilizzo di questi metodi:

  • È possibile che l'app debba codificare molti caratteri di input in una tabella codici ed elaborare i caratteri usando più chiamate. In questo caso, probabilmente è necessario mantenere lo stato tra le chiamate, prendendo in considerazione lo stato reso permanente dall'oggetto in Encoder uso. Ad esempio, una sequenza di caratteri che include coppie surrogate potrebbe terminare con un surrogato elevato. Il Encoder ricorderà che il surrogato elevato in modo che possa essere combinato con un surrogato basso all'inizio di una chiamata seguente. Encoding Non sarà in grado di mantenere lo stato, quindi il carattere verrà inviato al EncoderFallback.)

  • Se l'app gestisce gli input di stringa, è necessario chiamare la versione di stringa del GetBytes metodo.

  • La versione del buffer di caratteri Unicode di GetBytes(Char*, Int32, Byte*, Int32) consente alcune tecniche veloci, in particolare con più chiamate che usano l' Encoder oggetto o che si inseriscono in buffer esistenti. Tenere presente, tuttavia, che questa versione del metodo è talvolta non sicura, poiché i puntatori sono obbligatori.

  • Se l'app deve convertire una grande quantità di dati, deve riutilizzare il buffer di output. In questo caso, la GetBytes versione che supporta le matrici di byte è la scelta migliore.

  • Si consiglia di utilizzare il Encoder.Convert metodo anziché GetByteCount . Il metodo di conversione converte il maggior quantità possibile di dati e genera un'eccezione se il buffer di output è troppo piccolo. Per la codifica continua di un flusso, questo metodo è spesso la scelta migliore.

Vedi anche

Si applica a

.NET 9 e altre versioni
Prodotto Versioni
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0

GetBytes(String)

Origine:
Encoding.cs
Origine:
Encoding.cs
Origine:
Encoding.cs

Quando ne viene eseguito l'override in una classe derivata, codifica tutti i caratteri nella stringa specificata in una sequenza di byte.

public virtual byte[] GetBytes (string s);

Parametri

s
String

Stringa contenente i caratteri da codificare.

Restituisce

Byte[]

Matrice di byte contenente i risultati della codifica del set di caratteri specificato.

Eccezioni

Si è verificato un fallback (per altre informazioni, vedere Codifica dei caratteri in .NET)

-e-

EncoderFallback è impostato su EncoderExceptionFallback.

Esempio

Nell'esempio seguente viene determinato il numero di byte necessari per codificare una stringa o un intervallo nella stringa, vengono codificati i caratteri e vengono visualizzati i byte risultanti.

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

*/

Commenti

Se i dati da convertire sono disponibili solo in blocchi sequenziali, ad esempio i dati letti da un flusso, o se la quantità di dati è talmente grande da poter essere divisa in blocchi più piccoli, è necessario usare Decoder o rispettivamente il Encoder metodo o fornito dal GetDecoder metodo o il GetEncoder metodo di una classe derivata.

Il GetByteCount metodo determina il numero di byte che comportano la codifica di un set di caratteri Unicode e il GetBytes metodo esegue la codifica effettiva. Il Encoding.GetBytes metodo prevede conversioni discrete, a differenza del Encoder.GetBytes metodo, che gestisce più conversioni in un singolo flusso di input.

Sono supportate diverse versioni di GetByteCount e GetBytes . Di seguito sono riportate alcune considerazioni di programmazione per l'utilizzo di questi metodi:

  • È possibile che l'app debba codificare molti caratteri di input in una tabella codici ed elaborare i caratteri usando più chiamate. In questo caso, probabilmente è necessario mantenere lo stato tra le chiamate, prendendo in considerazione lo stato reso permanente dall'oggetto in Encoder uso. Ad esempio, una sequenza di caratteri che include coppie surrogate potrebbe terminare con un surrogato elevato. Il Encoder ricorderà che il surrogato elevato in modo che possa essere combinato con un surrogato basso all'inizio di una chiamata seguente. Encoding Non sarà in grado di mantenere lo stato, quindi il carattere verrà inviato al EncoderFallback.)

  • Se l'app gestisce gli input di stringa, è necessario usare la versione in formato stringa di GetBytes .

  • La versione del buffer di caratteri Unicode di GetBytes(Char*, Int32, Byte*, Int32) consente alcune tecniche veloci, in particolare con più chiamate che usano l' Encoder oggetto o che si inseriscono in buffer esistenti. Tenere presente, tuttavia, che questa versione del metodo è talvolta non sicura, poiché i puntatori sono obbligatori.

  • Se l'app deve convertire una grande quantità di dati, deve riutilizzare il buffer di output. In questo caso, la GetBytes versione che supporta le matrici di byte è la scelta migliore.

  • Si consiglia di utilizzare il Encoder.Convert metodo anziché GetByteCount . Il metodo di conversione converte il maggior quantità possibile di dati e genera un'eccezione se il buffer di output è troppo piccolo. Per la codifica continua di un flusso, questo metodo è spesso la scelta migliore.

Vedi anche

Si applica a

.NET 9 e altre versioni
Prodotto Versioni
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0

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

Origine:
Encoding.cs
Origine:
Encoding.cs
Origine:
Encoding.cs

Quando ne viene eseguito l'override in una classe derivata, codifica un set di caratteri dall'intervallo di sola lettura specificato in un intervallo di byte.

public virtual int GetBytes (ReadOnlySpan<char> chars, Span<byte> bytes);

Parametri

chars
ReadOnlySpan<Char>

Intervallo contenente il set di caratteri da codificare.

bytes
Span<Byte>

Intervallo di byte in cui includere i byte codificati.

Restituisce

Numero di byte codificati.

Commenti

Se i dati da convertire sono disponibili solo in blocchi sequenziali, ad esempio i dati letti da un flusso, o se la quantità di dati è talmente grande da poter essere divisa in blocchi più piccoli, è necessario usare Decoder o rispettivamente il Encoder metodo o fornito dal GetDecoder metodo o il GetEncoder metodo di una classe derivata.

Il GetByteCount metodo determina il numero di byte che comportano la codifica di un set di caratteri Unicode e il GetBytes metodo esegue la codifica effettiva. Il Encoding.GetBytes metodo prevede conversioni discrete, a differenza del Encoder.GetBytes metodo, che gestisce più conversioni in un singolo flusso di input.

Sono supportate diverse versioni di GetByteCount e GetBytes . Di seguito sono riportate alcune considerazioni di programmazione per l'utilizzo di questi metodi:

  • È possibile che l'app debba codificare molti caratteri di input in una tabella codici ed elaborare i caratteri usando più chiamate. In questo caso, probabilmente è necessario mantenere lo stato tra le chiamate, prendendo in considerazione lo stato reso permanente dall'oggetto in Encoder uso. Ad esempio, una sequenza di caratteri che include coppie surrogate potrebbe terminare con un surrogato elevato. Il Encoder ricorderà che il surrogato elevato in modo che possa essere combinato con un surrogato basso all'inizio di una chiamata seguente. Encoding Non sarà in grado di mantenere lo stato, quindi il carattere verrà inviato al EncoderFallback.)

  • Se l'app gestisce gli input di stringa, è necessario usare la versione in formato stringa di GetBytes .

  • Se l'app deve convertire una grande quantità di dati, deve riutilizzare il buffer di output. In questo caso, la GetBytes versione che supporta le matrici di byte è la scelta migliore.

  • Si consiglia di utilizzare il Encoder.Convert metodo anziché GetByteCount . Il metodo di conversione converte il maggior quantità possibile di dati e genera un'eccezione se il buffer di output è troppo piccolo. Per la codifica continua di un flusso, questo metodo è spesso la scelta migliore.

Si applica a

.NET 9 e altre versioni
Prodotto Versioni
.NET Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Standard 2.1

GetBytes(Char[], Int32, Int32)

Origine:
Encoding.cs
Origine:
Encoding.cs
Origine:
Encoding.cs

Quando ne viene eseguito l'override in una classe derivata, codifica un set di caratteri dalla matrice di caratteri specificata in una sequenza di byte.

public virtual byte[] GetBytes (char[] chars, int index, int count);

Parametri

chars
Char[]

Matrice di caratteri contenente il set di caratteri da codificare.

index
Int32

Indice del primo carattere da codificare.

count
Int32

Numero di caratteri da codificare.

Restituisce

Byte[]

Matrice di byte contenente i risultati della codifica del set di caratteri specificato.

Eccezioni

chars è null.

index o count è minore di zero.

-oppure-

index e count non indicano un intervallo valido in chars.

Si è verificato un fallback (per altre informazioni, vedere Codifica dei caratteri in .NET)

-e-

EncoderFallback è impostato su EncoderExceptionFallback.

Esempio

L'esempio seguente determina il numero di byte necessari per codificare tre caratteri da una matrice di caratteri, codifica i caratteri e Visualizza i byte risultanti.

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

*/

Commenti

Se i dati da convertire sono disponibili solo in blocchi sequenziali, ad esempio i dati letti da un flusso, o se la quantità di dati è talmente grande da poter essere divisa in blocchi più piccoli, è necessario usare Decoder o rispettivamente il Encoder metodo o fornito dal GetDecoder metodo o il GetEncoder metodo di una classe derivata.

Il GetByteCount metodo determina il numero di byte che comportano la codifica di un set di caratteri Unicode e il GetBytes metodo esegue la codifica effettiva. Il Encoding.GetBytes metodo prevede conversioni discrete, a differenza del Encoder.GetBytes metodo, che gestisce più conversioni in un singolo flusso di input.

Sono supportate diverse versioni di GetByteCount e GetBytes . Di seguito sono riportate alcune considerazioni di programmazione per l'utilizzo di questi metodi:

  • È possibile che l'app debba codificare molti caratteri di input in una tabella codici ed elaborare i caratteri usando più chiamate. In questo caso, probabilmente è necessario mantenere lo stato tra le chiamate, prendendo in considerazione lo stato reso permanente dall'oggetto in Encoder uso. Ad esempio, una sequenza di caratteri che include coppie di surrogati potrebbe terminare con un surrogato elevato. Encoder Ricorda che il surrogato elevato in modo che possa essere combinato con un surrogato basso all'inizio di una chiamata seguente. Encoding Non sarà in grado di mantenere lo stato, quindi il carattere verrà inviato al .EncoderFallback

  • Se l'app gestisce gli input di stringa, è necessario usare la versione in formato stringa di GetBytes .

  • La versione del buffer di caratteri Unicode di GetBytes(Char*, Int32, Byte*, Int32) consente alcune tecniche veloci, in particolare con più chiamate che usano l' Encoder oggetto o che si inseriscono in buffer esistenti. Tenere presente, tuttavia, che questa versione del metodo è talvolta non sicura, poiché i puntatori sono obbligatori.

  • Se l'app deve convertire una grande quantità di dati, deve riutilizzare il buffer di output. In questo caso, la GetBytes versione che supporta le matrici di byte è la scelta migliore.

  • Si consiglia di utilizzare il Encoder.Convert metodo anziché GetByteCount . Il metodo di conversione converte il maggior quantità possibile di dati e genera un'eccezione se il buffer di output è troppo piccolo. Per la codifica continua di un flusso, questo metodo è spesso la scelta migliore.

Vedi anche

Si applica a

.NET 9 e altre versioni
Prodotto Versioni
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0

GetBytes(String, Int32, Int32)

Origine:
Encoding.cs
Origine:
Encoding.cs
Origine:
Encoding.cs

Quando ne viene eseguito l'override in una classe derivata, codifica in una matrice di byte il numero di caratteri specificato da count nella stringa specificata, a partire dal valore di index specificato.

public byte[] GetBytes (string s, int index, int count);

Parametri

s
String

Stringa contenente i caratteri da codificare.

index
Int32

Indice all'interno della stringa da cui iniziare la codifica.

count
Int32

Numero di caratteri da codificare.

Restituisce

Byte[]

Matrice di byte contenente i risultati della codifica del set di caratteri specificato.

Esempio

Nell'esempio seguente viene determinato il numero di byte necessari per codificare una stringa o un intervallo nella stringa, vengono codificati i caratteri e vengono visualizzati i byte risultanti.

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

*/

Commenti

Se i dati da convertire sono disponibili solo in blocchi sequenziali, ad esempio i dati letti da un flusso, o se la quantità di dati è talmente grande da poter essere divisa in blocchi più piccoli, è necessario usare Decoder o rispettivamente il Encoder metodo o fornito dal GetDecoder metodo o il GetEncoder metodo di una classe derivata.

Il GetByteCount metodo determina il numero di byte che comportano la codifica di un set di caratteri Unicode e il GetBytes metodo esegue la codifica effettiva. Il Encoding.GetBytes metodo prevede conversioni discrete, a differenza del Encoder.GetBytes metodo, che gestisce più conversioni in un singolo flusso di input.

Sono supportate diverse versioni di GetByteCount e GetBytes . Di seguito sono riportate alcune considerazioni di programmazione per l'utilizzo di questi metodi:

  • È possibile che l'app debba codificare molti caratteri di input in una tabella codici ed elaborare i caratteri usando più chiamate. In questo caso, probabilmente è necessario mantenere lo stato tra le chiamate, prendendo in considerazione lo stato reso permanente dall'oggetto in Encoder uso. Ad esempio, una sequenza di caratteri che include coppie di surrogati potrebbe terminare con un surrogato elevato. Encoder Ricorda che il surrogato elevato in modo che possa essere combinato con un surrogato basso all'inizio di una chiamata seguente. Encoding Non sarà in grado di mantenere lo stato, quindi il carattere verrà inviato al .EncoderFallback

  • Se l'app gestisce gli input di stringa, è necessario usare la versione in formato stringa di GetBytes .

  • La versione del buffer di caratteri Unicode di GetBytes(Char*, Int32, Byte*, Int32) consente alcune tecniche veloci, in particolare con più chiamate che usano l' Encoder oggetto o che si inseriscono in buffer esistenti. Tenere presente, tuttavia, che questa versione del metodo è talvolta non sicura, poiché i puntatori sono obbligatori.

  • Se l'app deve convertire una grande quantità di dati, deve riutilizzare il buffer di output. In questo caso, la GetBytes versione che supporta le matrici di byte è la scelta migliore.

  • Si consiglia di utilizzare il Encoder.Convert metodo anziché GetByteCount . Il metodo di conversione converte il maggior quantità possibile di dati e genera un'eccezione se il buffer di output è troppo piccolo. Per la codifica continua di un flusso, questo metodo è spesso la scelta migliore.

Si applica a

.NET 9 e altre versioni
Prodotto Versioni
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Standard 2.1

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

Origine:
Encoding.cs
Origine:
Encoding.cs
Origine:
Encoding.cs

Importante

Questa API non è conforme a CLS.

Quando ne viene eseguito l'override in una classe derivata, codifica un set di caratteri a partire dal puntatore ai caratteri specificato in una sequenza di byte archiviati a partire dal puntatore ai byte specificato.

[System.CLSCompliant(false)]
[System.Security.SecurityCritical]
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.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);

Parametri

chars
Char*

Puntatore al primo carattere da codificare.

charCount
Int32

Numero di caratteri da codificare.

bytes
Byte*

Puntatore alla posizione in cui iniziare a scrivere la sequenza di byte risultante.

byteCount
Int32

Numero massimo di byte da scrivere.

Restituisce

Numero effettivo di byte scritti nella posizione indicata dal parametro bytes.

Attributi

Eccezioni

chars è null.

-oppure-

bytes è null.

charCount o byteCount è minore di zero.

byteCount è minore del numero di byte risultante.

Si è verificato un fallback (per altre informazioni, vedere Codifica dei caratteri in .NET)

-e-

EncoderFallback è impostato su EncoderExceptionFallback.

Commenti

Per calcolare la dimensione esatta della matrice GetBytes necessaria per archiviare i byte risultanti, chiamare il GetByteCount metodo. Per calcolare la dimensione massima della matrice, chiamare il GetMaxByteCount metodo. Il GetByteCount metodo in genere consente l'allocazione di una quantità di memoria inferiore, mentre il GetMaxByteCount metodo viene in genere eseguito più velocemente.

Se il conversione dei dati sono disponibili solo in blocchi sequenziali (ad esempio i dati letti da un flusso) o se la quantità di dati è talmente grande che deve essere suddiviso in blocchi più piccoli, è necessario utilizzare il Decoder o Encoder oggetto fornito dal GetDecoder o GetEncoder (metodo), rispettivamente, di una classe derivata.

Il GetByteCount metodo determina il numero di byte che comportano la codifica di un set di caratteri Unicode e il GetBytes metodo esegue la codifica effettiva. Il GetBytes metodo prevede conversioni discrete, a differenza del Encoder.GetBytes metodo, che gestisce più conversioni in un singolo flusso di input.

Sono supportate diverse versioni di GetByteCount e GetBytes . Di seguito sono riportate alcune considerazioni di programmazione per l'utilizzo di questi metodi:

  • È possibile che l'app debba codificare molti caratteri di input in una tabella codici ed elaborare i caratteri usando più chiamate. In questo caso, probabilmente è necessario mantenere lo stato tra le chiamate, prendendo in considerazione lo stato reso permanente dall'oggetto in Encoder uso. Ad esempio, una sequenza di caratteri che include coppie di surrogati potrebbe terminare con un surrogato elevato. Encoder Ricorda che il surrogato elevato in modo che possa essere combinato con un surrogato basso all'inizio di una chiamata seguente. Encoding Non sarà in grado di mantenere lo stato, quindi il carattere verrà inviato al .EncoderFallback

  • Se l'app gestisce gli input di stringa, è necessario usare la versione in formato stringa di GetBytes .

  • La versione del buffer di caratteri Unicode di GetBytes(Char*, Int32, Byte*, Int32) consente alcune tecniche veloci, in particolare con più chiamate che usano l' Encoder oggetto o che si inseriscono in buffer esistenti. Tenere presente, tuttavia, che questa versione del metodo è talvolta non sicura, poiché i puntatori sono obbligatori.

  • Se l'app deve convertire una grande quantità di dati, deve riutilizzare il buffer di output. In questo caso, la GetBytes versione che supporta le matrici di byte è la scelta migliore.

  • Si consiglia di utilizzare il Encoder.Convert metodo anziché GetByteCount . Il metodo di conversione converte il maggior quantità possibile di dati e genera un'eccezione se il buffer di output è troppo piccolo. Per la codifica continua di un flusso, questo metodo è spesso la scelta migliore.

Vedi anche

Si applica a

.NET 9 e altre versioni
Prodotto Versioni
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0

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

Origine:
Encoding.cs
Origine:
Encoding.cs
Origine:
Encoding.cs

Quando ne viene eseguito l'override in una classe derivata, codifica un set di caratteri dalla matrice di caratteri specificata nella matrice di byte specificata.

public abstract int GetBytes (char[] chars, int charIndex, int charCount, byte[] bytes, int byteIndex);

Parametri

chars
Char[]

Matrice di caratteri contenente il set di caratteri da codificare.

charIndex
Int32

Indice del primo carattere da codificare.

charCount
Int32

Numero di caratteri da codificare.

bytes
Byte[]

Matrice di byte che deve contenere la sequenza di byte risultante.

byteIndex
Int32

Indice in corrispondenza del quale iniziare a scrivere la sequenza di byte risultante.

Restituisce

Numero effettivo di byte scritti in bytes.

Eccezioni

chars è null.

-oppure-

bytes è null.

charIndex o charCount o byteIndex è minore di zero.

-oppure-

charIndex e charCount non identificano un intervallo valido in chars.

-oppure-

byteIndex non è un indice valido in bytes.

bytes non dispone di sufficiente capacità da byteIndex alla fine della matrice per contenere i byte risultanti.

Si è verificato un fallback (per altre informazioni, vedere Codifica dei caratteri in .NET)

-e-

EncoderFallback è impostato su EncoderExceptionFallback.

Esempio

L'esempio seguente determina il numero di byte necessari per codificare tre caratteri da una matrice di caratteri, codifica i caratteri e Visualizza i byte risultanti.

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

*/

Commenti

Per calcolare la dimensione esatta della matrice richiesta da GetBytes per archiviare i byte risultanti, è necessario chiamare il GetByteCount metodo. Per calcolare la dimensione massima della matrice, chiamare il GetMaxByteCount metodo. Il GetByteCount metodo in genere consente l'allocazione di una quantità di memoria inferiore, mentre il GetMaxByteCount metodo viene in genere eseguito più velocemente.

Se i dati da convertire sono disponibili solo in blocchi sequenziali, ad esempio i dati letti da un flusso, o se la quantità di dati è talmente grande da poter essere divisa in blocchi più piccoli, è necessario usare Decoder o rispettivamente il Encoder metodo o fornito dal GetDecoder metodo o il GetEncoder metodo di una classe derivata.

Il GetByteCount metodo determina il numero di byte che comportano la codifica di un set di caratteri Unicode e il GetBytes metodo esegue la codifica effettiva. Il Encoding.GetBytes metodo prevede conversioni discrete, a differenza del Encoder.GetBytes metodo, che gestisce più conversioni in un singolo flusso di input.

Sono supportate diverse versioni di GetByteCount e GetBytes . Di seguito sono riportate alcune considerazioni di programmazione per l'utilizzo di questi metodi:

  • È possibile che l'app debba codificare molti caratteri di input in una tabella codici ed elaborare i caratteri usando più chiamate. In questo caso, probabilmente è necessario mantenere lo stato tra le chiamate, prendendo in considerazione lo stato reso permanente dall'oggetto in Encoder uso. Ad esempio, una sequenza di caratteri che include coppie di surrogati potrebbe terminare con un surrogato elevato. Encoder Ricorda che il surrogato elevato in modo che possa essere combinato con un surrogato basso all'inizio di una chiamata seguente. Encoding Non sarà in grado di mantenere lo stato, quindi il carattere verrà inviato al .EncoderFallback

  • Se l'app gestisce gli input di stringa, è necessario usare la versione in formato stringa di GetBytes .

  • La versione del buffer di caratteri Unicode di GetBytes(Char*, Int32, Byte*, Int32) consente alcune tecniche veloci, in particolare con più chiamate che usano l' Encoder oggetto o che si inseriscono in buffer esistenti. Tenere presente, tuttavia, che questa versione del metodo è talvolta non sicura, poiché i puntatori sono obbligatori.

  • Se l'app deve convertire una grande quantità di dati, deve riutilizzare il buffer di output. In questo caso, la GetBytes versione che supporta le matrici di byte è la scelta migliore.

  • Si consiglia di utilizzare il Encoder.Convert metodo anziché GetByteCount . Il metodo di conversione converte il maggior quantità possibile di dati e genera un'eccezione se il buffer di output è troppo piccolo. Per la codifica continua di un flusso, questo metodo è spesso la scelta migliore.

Vedi anche

Si applica a

.NET 9 e altre versioni
Prodotto Versioni
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0

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

Origine:
Encoding.cs
Origine:
Encoding.cs
Origine:
Encoding.cs

Quando ne viene eseguito l'override in una classe derivata, codifica un set di caratteri dalla stringa specificata nella matrice di byte specificata.

public virtual int GetBytes (string s, int charIndex, int charCount, byte[] bytes, int byteIndex);

Parametri

s
String

Stringa contenente il set di caratteri da codificare.

charIndex
Int32

Indice del primo carattere da codificare.

charCount
Int32

Numero di caratteri da codificare.

bytes
Byte[]

Matrice di byte che deve contenere la sequenza di byte risultante.

byteIndex
Int32

Indice in corrispondenza del quale iniziare a scrivere la sequenza di byte risultante.

Restituisce

Numero effettivo di byte scritti in bytes.

Eccezioni

s è null.

-oppure-

bytes è null.

charIndex o charCount o byteIndex è minore di zero.

-oppure-

charIndex e charCount non identificano un intervallo valido in chars.

-oppure-

byteIndex non è un indice valido in bytes.

bytes non dispone di sufficiente capacità da byteIndex alla fine della matrice per contenere i byte risultanti.

Si è verificato un fallback (per altre informazioni, vedere Codifica dei caratteri in .NET)

-e-

EncoderFallback è impostato su EncoderExceptionFallback.

Esempio

Nell'esempio seguente viene determinato il numero di byte necessari per codificare una stringa o un intervallo nella stringa, vengono codificati i caratteri e vengono visualizzati i byte risultanti.

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

*/

Commenti

Per calcolare la dimensione esatta della matrice richiesta da GetBytes per archiviare i byte risultanti, è necessario chiamare il GetByteCount metodo. Per calcolare la dimensione massima della matrice, chiamare il GetMaxByteCount metodo. Il GetByteCount metodo in genere consente l'allocazione di una quantità di memoria inferiore, mentre il GetMaxByteCount metodo viene in genere eseguito più velocemente.

Se i dati da convertire sono disponibili solo in blocchi sequenziali, ad esempio i dati letti da un flusso, o se la quantità di dati è talmente grande da poter essere divisa in blocchi più piccoli, è necessario usare Decoder o rispettivamente il Encoder metodo o fornito dal GetDecoder metodo o il GetEncoder metodo di una classe derivata.

Il GetByteCount metodo determina il numero di byte che comportano la codifica di un set di caratteri Unicode e il GetBytes metodo esegue la codifica effettiva. Il Encoding.GetBytes metodo prevede conversioni discrete, a differenza del Encoder.GetBytes metodo, che gestisce più conversioni in un singolo flusso di input.

Sono supportate diverse versioni di GetByteCount e GetBytes . Di seguito sono riportate alcune considerazioni di programmazione per l'utilizzo di questi metodi:

  • È possibile che l'app debba codificare molti caratteri di input in una tabella codici ed elaborare i caratteri usando più chiamate. In questo caso, probabilmente è necessario mantenere lo stato tra le chiamate, prendendo in considerazione lo stato reso permanente dall'oggetto in Encoder uso. Ad esempio, una sequenza di caratteri che include coppie di surrogati potrebbe terminare con un surrogato elevato. Encoder Ricorda che il surrogato elevato in modo che possa essere combinato con un surrogato basso all'inizio di una chiamata seguente. Encoding Non sarà in grado di mantenere lo stato, quindi il carattere verrà inviato al .EncoderFallback

  • Se l'app gestisce gli input di stringa, è necessario usare la versione in formato stringa di GetBytes .

  • La versione del buffer di caratteri Unicode di GetBytes(Char*, Int32, Byte*, Int32) consente alcune tecniche veloci, in particolare con più chiamate che usano l' Encoder oggetto o che si inseriscono in buffer esistenti. Tenere presente, tuttavia, che questa versione del metodo è talvolta non sicura, poiché i puntatori sono obbligatori.

  • Se l'app deve convertire una grande quantità di dati, deve riutilizzare il buffer di output. In questo caso, la GetBytes versione che supporta le matrici di byte è la scelta migliore.

  • Si consiglia di utilizzare il Encoder.Convert metodo anziché GetByteCount . Il metodo di conversione converte il maggior quantità possibile di dati e genera un'eccezione se il buffer di output è troppo piccolo. Per la codifica continua di un flusso, questo metodo è spesso la scelta migliore.

Vedi anche

Si applica a

.NET 9 e altre versioni
Prodotto Versioni
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0