Questo articolo è stato tradotto automaticamente. Per visualizzare l'articolo in inglese, selezionare la casella di controllo Inglese. È possibile anche visualizzare il testo inglese in una finestra popup posizionando il puntatore del mouse sopra il testo.
Traduzione
Inglese

Metodo Encoding.GetCharCount (Byte[], Int32, Int32)

 

Data di pubblicazione: ottobre 2016

Quando ne viene eseguito l'override in una classe derivata, calcola il numero di caratteri prodotti dalla decodifica di una sequenza di byte dalla matrice di byte specificata.

Spazio dei nomi:   System.Text
Assembly:  mscorlib (in mscorlib.dll)

public abstract int GetCharCount(
	byte[] bytes,
	int index,
	int count
)

Parametri

bytes
Type: System.Byte[]

Matrice di byte contenente la sequenza di byte da decodificare.

index
Type: System.Int32

Indice del primo byte da decodificare.

count
Type: System.Int32

Numero di byte da decodificare.

Valore restituito

Type: System.Int32

Numero di caratteri prodotti dalla decodifica della sequenza di byte specificata.

Exception Condition
ArgumentNullException

bytes è null.

ArgumentOutOfRangeException

index o count è minore di zero.

-oppure-

index e count non indicano un intervallo valido in bytes.

DecoderFallbackException

Si è verificato un fallback. Vedere Codifica di caratteri in .NET Framework per una spiegazione completa

-e-

DecoderFallback è impostato su DecoderExceptionFallback.

Per calcolare la dimensione di matrice esatti necessari per GetChars per archiviare i caratteri risultanti, è necessario utilizzare il GetCharCount metodo. Per calcolare la dimensione massima della matrice, utilizzare il GetMaxCharCount metodo. Il GetCharCount metodo consente in genere l'allocazione di memoria inferiore, mentre il GetMaxCharCount metodo in genere viene eseguito più velocemente.

Il GetCharCount metodo determina il numero di caratteri risultanti dalla decodifica di una sequenza di byte e GetChars metodo esegue la decodifica effettiva. Il GetChars metodo prevede conversioni discrete, a differenza di Decoder.GetChars metodo che gestisce più passaggi su un singolo flusso di input.

Versioni diverse di GetCharCount e GetChars sono supportati. Di seguito sono riportate alcune considerazioni di programmazione per l'utilizzo di questi metodi:

  • L'applicazione potrebbe essere necessario decodificare più byte di input da una tabella codici ed elaborare i byte utilizzando più chiamate. In questo caso, è probabilmente necessario mantenere lo stato tra le chiamate.

  • Se l'applicazione gestisce gli output di stringa, è consigliabile utilizzare il GetString metodo. Poiché questo metodo deve controllare la lunghezza della stringa e allocare un buffer, risulta leggermente più lento, ma risultante String tipo è preferibile.

  • La versione byte di GetChars(Byte*, Int32, Char*, Int32) consente alcune tecniche veloci, in particolare con più chiamate al buffer di grandi dimensioni. Tenere presente tuttavia che questa versione del metodo a volte è sicuro, poiché i puntatori sono necessari.

  • Se l'applicazione deve convertire una grande quantità di dati, è necessario che riutilizzi il buffer di output. In questo caso, il GetChars(Byte[], Int32, Int32, Char[], Int32) versione che supporta buffer di caratteri di output è la scelta migliore.

  • Si consiglia di utilizzare il Decoder.Convert metodo invece GetCharCount. Il metodo di conversione converte tutti i dati possibili e genera un'eccezione se il buffer di output è troppo piccolo. Per la decodifica continua di un flusso, questo metodo è spesso la scelta migliore.

Nell'esempio seguente converte una stringa da una codifica a altra.

using System;
using System.Text;

class Example
{
   static void Main()
   {
      string unicodeString = "This string contains the unicode character Pi (\u03a0)";

      // Create two different encodings.
      Encoding ascii = Encoding.ASCII;
      Encoding unicode = Encoding.Unicode;

      // Convert the string into a byte array.
      byte[] unicodeBytes = unicode.GetBytes(unicodeString);

      // Perform the conversion from one encoding to the other.
      byte[] asciiBytes = Encoding.Convert(unicode, ascii, unicodeBytes);

      // Convert the new byte[] into a char[] and then into a string.
      char[] asciiChars = new char[ascii.GetCharCount(asciiBytes, 0, asciiBytes.Length)];
      ascii.GetChars(asciiBytes, 0, asciiBytes.Length, asciiChars, 0);
      string asciiString = new string(asciiChars);

      // Display the strings created before and after the conversion.
      Console.WriteLine("Original string: {0}", unicodeString);
      Console.WriteLine("Ascii converted string: {0}", asciiString);
   }
}
// The example displays the following output:
//    Original string: This string contains the unicode character Pi (Π)
//    Ascii converted string: This string contains the unicode character Pi (?)

Nell'esempio seguente viene codificata una stringa in una matrice di byte e quindi decodifica un intervallo di byte in una matrice di caratteri.

using System;
using System.Text;

public class SamplesEncoding  {

   public static void Main()  {

      // Create two instances of UTF32Encoding: one with little-endian byte order and one with big-endian byte order.
      Encoding u32LE = Encoding.GetEncoding( "utf-32" );
      Encoding u32BE = Encoding.GetEncoding( "utf-32BE" );

      // Use a string containing the following characters:
      //    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)
      String myStr = "za\u0306\u01FD\u03B2";

      // Encode the string using the big-endian byte order.
      byte[] barrBE = new byte[u32BE.GetByteCount( myStr )];
      u32BE.GetBytes( myStr, 0, myStr.Length, barrBE, 0 );

      // Encode the string using the little-endian byte order.
      byte[] barrLE = new byte[u32LE.GetByteCount( myStr )];
      u32LE.GetBytes( myStr, 0, myStr.Length, barrLE, 0 );

      // Get the char counts, decode eight bytes starting at index 0,
      // and print out the counts and the resulting bytes.
      Console.Write( "BE array with BE encoding : " );
      PrintCountsAndChars( barrBE, 0, 8, u32BE );
      Console.Write( "LE array with LE encoding : " );
      PrintCountsAndChars( barrLE, 0, 8, u32LE );

   }


   public static void PrintCountsAndChars( byte[] bytes, int index, int count, Encoding enc )  {

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

      // Display the exact character count.
      int iCC  = enc.GetCharCount( bytes, index, count );
      Console.Write( " {0,-3}", iCC );

      // Display the maximum character count.
      int iMCC = enc.GetMaxCharCount( count );
      Console.Write( " {0,-3} :", iMCC );

      // Decode the bytes and display the characters.
      char[] chars = enc.GetChars( bytes, index, count );

      // The following is an alternative way to decode the bytes:
      // char[] chars = new char[iCC];
      // enc.GetChars( bytes, index, count, chars, 0 );

      Console.WriteLine( chars );

   }

}


/* 
This code produces the following output.  The question marks take the place of characters that cannot be displayed at the console.

BE array with BE encoding : System.Text.UTF32Encoding : 2   6   :za
LE array with LE encoding : System.Text.UTF32Encoding : 2   6   :za

*/

Universal Windows Platform
Disponibile da 8
.NET Framework
Disponibile da 1.1
Libreria di classi portabile
Supportato in: piattaforme .NET portabili
Silverlight
Disponibile da 2.0
Windows Phone Silverlight
Disponibile da 7.0
Windows Phone
Disponibile da 8.1
Torna all'inizio
Mostra: