Encoding.GetChars Método

Definição

Quando é sobreposto numa classe derivada, decodifica uma sequência de bytes num conjunto de caracteres.

Sobrecargas

Name Description
GetChars(Byte[], Int32, Int32, Char[], Int32)

Quando sobrescrito numa classe derivada, decodifica uma sequência de bytes do array de bytes especificado para o array de caracteres especificado.

GetChars(Byte*, Int32, Char*, Int32)

Quando sobrescrito numa classe derivada, decodifica uma sequência de bytes a partir do ponteiro de byte especificado para um conjunto de caracteres que são armazenados a partir do ponteiro especificado.

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

Quando sobrescrito numa classe derivada, decodifica todos os bytes do intervalo de bytes especificado para apenas leitura num espaço de caracteres.

GetChars(Byte[])

Quando sobrescrito numa classe derivada, descodifica todos os bytes do array de bytes especificado num conjunto de caracteres.

GetChars(Byte[], Int32, Int32)

Quando sobrescrito numa classe derivada, decodifica uma sequência de bytes do array de bytes especificado num conjunto de caracteres.

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

Quando sobrescrito numa classe derivada, decodifica uma sequência de bytes do array de bytes especificado para o array de caracteres especificado.

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

Parâmetros

bytes
Byte[]

O array de bytes que contém a sequência de bytes a decodificar.

byteIndex
Int32

O índice do primeiro byte a descodificar.

byteCount
Int32

O número de bytes a descodificar.

chars
Char[]

O array de caracteres para conter o conjunto resultante de caracteres.

charIndex
Int32

O índice a partir do qual começar a escrever o conjunto resultante de caracteres.

Devoluções

O número real de caracteres escritos em chars.

Exceções

bytes é null.

-ou-

chars é null.

byteIndex ou byteCount ou charIndex é menor que zero.

-ou-

byteIndex e byteCount não denotam um intervalo válido em bytes.

-ou-

charIndex não é um índice válido em chars.

chars não tem capacidade suficiente de charIndex até ao fim do array para acomodar os caracteres resultantes.

Ocorreu um recurso de recurso (para mais informações, veja Codificação de Caracteres em .NET)

- e -

DecoderFallback está definido como DecoderExceptionFallback.

Exemplos

O exemplo seguinte converte uma cadeia de uma codificação para outra.

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 (?)
Imports System.Text

Class Example
   Shared Sub Main()
      Dim unicodeString As String = "This string contains the unicode character Pi (" & ChrW(&H03A0) & ")"

      ' Create two different encodings.
      Dim ascii As Encoding = Encoding.ASCII
      Dim unicode As Encoding = Encoding.Unicode

      ' Convert the string into a byte array.
      Dim unicodeBytes As Byte() = unicode.GetBytes(unicodeString)

      ' Perform the conversion from one encoding to the other.
      Dim asciiBytes As Byte() = Encoding.Convert(unicode, ascii, unicodeBytes)

      ' Convert the new byte array into a char array and then into a string.
      Dim asciiChars(ascii.GetCharCount(asciiBytes, 0, asciiBytes.Length)-1) As Char
      ascii.GetChars(asciiBytes, 0, asciiBytes.Length, asciiChars, 0)
      Dim asciiString As 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)
   End Sub
End Class
' 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 (?)

O exemplo seguinte codifica uma cadeia num array de bytes, e depois descodifica um intervalo desses bytes num array de caracteres.

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

*/
Imports System.Text

Public Class SamplesEncoding   

   Public Shared Sub Main()

      ' Create two instances of UTF32Encoding: one with little-endian byte order and one with big-endian byte order.
      Dim u32LE As Encoding = Encoding.GetEncoding("utf-32")
      Dim u32BE As Encoding = 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)
      Dim myStr As String = "za" & ChrW(&H0306) & ChrW(&H01FD) & ChrW(&H03B2)

      ' Encode the string using the big-endian byte order.
      ' NOTE: In VB.NET, arrays contain one extra element by default.
      '       The following line creates barrBE with the exact number of elements required.
      Dim barrBE(u32BE.GetByteCount(myStr) - 1) As Byte
      u32BE.GetBytes(myStr, 0, myStr.Length, barrBE, 0)

      ' Encode the string using the little-endian byte order.
      ' NOTE: In VB.NET, arrays contain one extra element by default.
      '       The following line creates barrLE with the exact number of elements required.
      Dim barrLE(u32LE.GetByteCount(myStr) - 1) As Byte
      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)

   End Sub


   Public Shared Sub PrintCountsAndChars(bytes() As Byte, index As Integer, count As Integer, enc As Encoding)

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

      ' Display the exact character count.
      Dim iCC As Integer = enc.GetCharCount(bytes, index, count)
      Console.Write(" {0,-3}", iCC)

      ' Display the maximum character count.
      Dim iMCC As Integer = enc.GetMaxCharCount(count)
      Console.Write(" {0,-3} :", iMCC)

      ' Decode the bytes.
      Dim chars As Char() = enc.GetChars(bytes, index, count)

      ' The following is an alternative way to decode the bytes:
      ' 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 chars(iCC - 1) As Char
      ' enc.GetChars( bytes, index, count, chars, 0 )

      ' Display the characters.
      Console.WriteLine(chars)

   End Sub

End Class


'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

Observações

Para calcular o tamanho exato do array necessário GetChars para armazenar os caracteres resultantes, deve usar o GetCharCount método. Para calcular o tamanho máximo do array, use o GetMaxCharCount método. O GetCharCount método geralmente permite a alocação de menos memória, enquanto o GetMaxCharCount método geralmente é executado mais rapidamente.

GetChars(Byte[], Int32, Int32, Char[], Int32) obtém caracteres a partir de uma sequência de bytes de entrada. Encoding.GetChars é diferente de Decoder.GetChars porque Encoding espera conversões discretas, enquanto Decoder é concebido para múltiplas passagens num único fluxo de entrada.

Se os dados a serem convertidos estiverem disponíveis apenas em blocos sequenciais (como dados lidos de um fluxo) ou se a quantidade de dados for tão grande que precise ser dividida em blocos menores, você deverá usar o Decoder ou o Encoder fornecidos pelo método GetDecoder ou pelo método GetEncoder, respectivamente, de uma classe derivada.

Note

Este método destina-se a operar sobre caracteres Unicode, não sobre dados binários arbitrários, como arrays de bytes. Se precisar de codificar dados binários arbitrários em texto, deve usar um protocolo como o uuencode, que é implementado por métodos como Convert.ToBase64CharArray.

O GetCharCount método determina quantos caracteres resultam na decodificação de uma sequência de bytes, e o GetChars método realiza a decodificação propriamente dita. O Encoding.GetChars método espera conversões discretas, ao contrário do Decoder.GetChars método, que lida com múltiplas passagens num único fluxo de entrada.

Várias versões de GetCharCount e GetChars são suportadas. Seguem-se algumas considerações de programação para a utilização destes métodos:

  • A sua aplicação pode precisar de decodificar múltiplos bytes de entrada a partir de uma página de código e processar esses bytes usando várias chamadas. Neste caso, provavelmente precisa de manter o estado entre chamadas, porque as sequências de bytes podem ser interrompidas quando processadas em lotes. (Por exemplo, parte de uma sequência de deslocamento ISO-2022 pode terminar uma GetChars chamada e continuar no início da chamada seguinte GetChars . Encoding.GetChars chamará a reserva para essas sequências incompletas, mas Decoder memorizará essas sequências para a chamada seguinte.)

  • Se a sua aplicação gerir as saídas de strings, o GetString método é recomendado. Como este método deve verificar o comprimento da corda e alocar um buffer, é ligeiramente mais lento, mas o tipo resultante String é preferível.

  • A versão em bytes permite GetChars(Byte*, Int32, Char*, Int32) algumas técnicas rápidas, particularmente com múltiplas chamadas para buffers grandes. Tenha em mente, no entanto, que esta versão do método por vezes não é segura, pois são necessários ponteiros.

  • Se a sua aplicação tiver de converter uma grande quantidade de dados, deve reutilizar o buffer de saída. Neste caso, a GetChars(Byte[], Int32, Int32, Char[], Int32) versão que suporta buffers de caracteres de saída é a melhor escolha.

  • Considere usar o Decoder.Convert método em vez de GetCharCount. O método de conversão converte o máximo de dados possível e lança uma exceção se o buffer de saída for demasiado pequeno. Para a decodificação contínua de um fluxo, este método é frequentemente a melhor escolha.

Ver também

Aplica-se a

GetChars(Byte*, Int32, Char*, Int32)

Importante

Esta API não está em conformidade com CLS.

Quando sobrescrito numa classe derivada, decodifica uma sequência de bytes a partir do ponteiro de byte especificado para um conjunto de caracteres que são armazenados a partir do ponteiro especificado.

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

Parâmetros

bytes
Byte*

Um apontador para o primeiro byte a descodificar.

byteCount
Int32

O número de bytes a descodificar.

chars
Char*

Um indicador para o local onde começar a escrever o conjunto resultante de caracteres.

charCount
Int32

O número máximo de caracteres para escrever.

Devoluções

O número real de caracteres escritos no local indicado pelo chars parâmetro.

Atributos

Exceções

bytes é null.

-ou-

chars é null.

byteCount ou charCount é inferior a zero.

charCount é inferior ao número resultante de caracteres.

Ocorreu um recurso de recurso (para mais informações, veja Codificação de Caracteres em .NET)

- e -

DecoderFallback está definido como DecoderExceptionFallback.

Observações

Para calcular o tamanho exato do array que GetChars requer armazenar os caracteres resultantes, deve usar o GetCharCount método. Para calcular o tamanho máximo do array, use o GetMaxCharCount método. O GetCharCount método geralmente permite a alocação de menos memória, enquanto o GetMaxCharCount método geralmente é executado mais rapidamente.

Encoding.GetChars obtém caracteres a partir de uma sequência de bytes de entrada. Encoding.GetChars é diferente de Decoder.GetChars porque Encoding espera conversões discretas, enquanto Decoder é concebido para múltiplas passagens num único fluxo de entrada.

Se os dados a converter estiverem disponíveis apenas em blocos sequenciais (como dados lidos de um fluxo) ou se a quantidade de dados for tão grande que precisa de ser dividida em blocos mais pequenos, deve usar o Decoder ou o Encoder objeto fornecido pelo GetDecoder ou o GetEncoder método, respetivamente, de uma classe derivada.

Note

Este método destina-se a operar sobre caracteres Unicode, não sobre dados binários arbitrários, como arrays de bytes. Se precisar de codificar dados binários arbitrários em texto, deve usar um protocolo como o uuencode, que é implementado por métodos como Convert.ToBase64CharArray.

O GetCharCount método determina quantos caracteres resultam na decodificação de uma sequência de bytes, e o GetChars método realiza a decodificação propriamente dita. O Encoding.GetChars método espera conversões discretas, ao contrário do Decoder.GetChars método, que lida com múltiplas passagens num único fluxo de entrada.

Várias versões de GetCharCount e GetChars são suportadas. Seguem-se algumas considerações de programação para a utilização destes métodos:

  • A sua aplicação pode precisar de decodificar múltiplos bytes de entrada a partir de uma página de código e processar esses bytes usando várias chamadas. Neste caso, provavelmente precisa de manter o estado entre chamadas, porque as sequências de bytes podem ser interrompidas quando processadas em lotes. (Por exemplo, parte de uma sequência de deslocamento ISO-2022 pode terminar uma GetChars chamada e continuar no início da chamada seguinte GetChars . Encoding.GetChars chamará a reserva para essas sequências incompletas, mas Decoder memorizará essas sequências para a chamada seguinte.)

  • Se a sua aplicação gerir as saídas de strings, o GetString método é recomendado. Como este método deve verificar o comprimento da corda e alocar um buffer, é ligeiramente mais lento, mas o tipo resultante String é preferível.

  • A versão em bytes permite GetChars(Byte*, Int32, Char*, Int32) algumas técnicas rápidas, particularmente com múltiplas chamadas para buffers grandes. Tenha em mente, no entanto, que esta versão do método por vezes não é segura, pois são necessários ponteiros.

  • Se a sua aplicação tiver de converter uma grande quantidade de dados, deve reutilizar o buffer de saída. Neste caso, a GetChars(Byte[], Int32, Int32, Char[], Int32) versão que suporta buffers de caracteres de saída é a melhor escolha.

  • Considere usar o Decoder.Convert método em vez de GetCharCount. O método de conversão converte o máximo de dados possível e lança uma exceção se o buffer de saída for demasiado pequeno. Para a decodificação contínua de um fluxo, este método é frequentemente a melhor escolha.

Ver também

Aplica-se a

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

Quando sobrescrito numa classe derivada, decodifica todos os bytes do intervalo de bytes especificado para apenas leitura num espaço de caracteres.

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

Parâmetros

bytes
ReadOnlySpan<Byte>

Um span de apenas leitura contendo a sequência de bytes a decodificar.

chars
Span<Char>

O espaço de caracteres que recebe os bytes decodificados.

Devoluções

O número real de caracteres escritos no espaço indicado pelo chars parâmetro.

Observações

Encoding.GetChars obtém caracteres a partir de um intervalo de bytes de entrada. Encoding.GetChars é diferente de Decoder.GetChars porque Encoding espera conversões discretas, enquanto Decoder é concebido para múltiplas passagens num único fluxo de entrada.

Se os dados a serem convertidos estiverem disponíveis apenas em blocos sequenciais (como dados lidos de um fluxo) ou se a quantidade de dados for tão grande que precise ser dividida em blocos menores, você deverá usar o Decoder ou o Encoder fornecidos pelo método GetDecoder ou pelo método GetEncoder, respectivamente, de uma classe derivada.

O GetCharCount método determina quantos caracteres resultam na decodificação de uma sequência de bytes, e o GetChars método realiza a decodificação propriamente dita. O Encoding.GetChars método espera conversões discretas, ao contrário do Decoder.GetChars método, que lida com múltiplas passagens num único fluxo de entrada.

Várias versões de GetCharCount e GetChars são suportadas. Seguem-se algumas considerações de programação para a utilização destes métodos:

  • A sua aplicação pode precisar de decodificar múltiplos bytes de entrada a partir de uma página de código e processar esses bytes usando várias chamadas. Neste caso, provavelmente precisa de manter o estado entre chamadas, porque as sequências de bytes podem ser interrompidas quando processadas em lotes. (Por exemplo, parte de uma sequência de deslocamento ISO-2022 pode terminar uma GetChars chamada e continuar no início da chamada seguinte GetChars . Encoding.GetChars chamará a reserva para essas sequências incompletas, mas Decoder memorizará essas sequências para a chamada seguinte.)

  • Se a sua aplicação gerir as saídas das cadeias, recomenda-se usar o GetString método. Como este método deve verificar o comprimento da corda e alocar um buffer, é ligeiramente mais lento, mas o tipo resultante String é preferível.

  • A versão em bytes permite GetChars(Byte*, Int32, Char*, Int32) algumas técnicas rápidas, particularmente com múltiplas chamadas para buffers grandes. Tenha em mente, no entanto, que esta versão do método por vezes não é segura, pois são necessários ponteiros.

  • Se a sua aplicação tiver de converter uma grande quantidade de dados, deve reutilizar o buffer de saída. Neste caso, a GetChars(Byte[], Int32, Int32, Char[], Int32) versão que suporta buffers de caracteres de saída é a melhor escolha.

  • Considere usar o Decoder.Convert método em vez de GetCharCount. O método de conversão converte o máximo de dados possível e lança uma exceção se o buffer de saída for demasiado pequeno. Para a decodificação contínua de um fluxo, este método é frequentemente a melhor escolha.

Aplica-se a

GetChars(Byte[])

Quando sobrescrito numa classe derivada, descodifica todos os bytes do array de bytes especificado num conjunto de caracteres.

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

Parâmetros

bytes
Byte[]

O array de bytes que contém a sequência de bytes a decodificar.

Devoluções

Char[]

Um array de caracteres contendo os resultados da decodificação da sequência especificada de bytes.

Exceções

bytes é null.

Ocorreu um recurso de recurso (para mais informações, veja Codificação de Caracteres em .NET)

- e -

DecoderFallback está definido como DecoderExceptionFallback.

Exemplos

O exemplo seguinte codifica uma string num array de bytes, e depois descodifica os bytes num array de caracteres.

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, and decode the byte arrays.
      Console.Write( "BE array with BE encoding : " );
      PrintCountsAndChars( barrBE, u32BE );
      Console.Write( "LE array with LE encoding : " );
      PrintCountsAndChars( barrLE, u32LE );
   }

   public static void PrintCountsAndChars( byte[] bytes, 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 );
      Console.Write( " {0,-3}", iCC );

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

      // Decode the bytes and display the characters.
      char[] chars = enc.GetChars( bytes );
      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 : 5   12  :zăǽβ
LE array with LE encoding : System.Text.UTF32Encoding : 5   12  :zăǽβ

*/
Imports System.Text

Public Class SamplesEncoding   

   Public Shared Sub Main()

      ' Create two instances of UTF32Encoding: one with little-endian byte order and one with big-endian byte order.
      Dim u32LE As Encoding = Encoding.GetEncoding("utf-32")
      Dim u32BE As Encoding = 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)
      Dim myStr As String = "za" & ChrW(&H0306) & ChrW(&H01FD) & ChrW(&H03B2) 

      ' Encode the string using the big-endian byte order.
      ' 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 barrBE(u32BE.GetByteCount(myStr) - 1) As Byte
      u32BE.GetBytes(myStr, 0, myStr.Length, barrBE, 0)

      ' Encode the string using the little-endian byte order.
      ' 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 barrLE(u32LE.GetByteCount(myStr) - 1) As Byte
      u32LE.GetBytes(myStr, 0, myStr.Length, barrLE, 0)

      ' Get the char counts, and decode the byte arrays.
      Console.Write("BE array with BE encoding : ")
      PrintCountsAndChars(barrBE, u32BE)
      Console.Write("LE array with LE encoding : ")
      PrintCountsAndChars(barrLE, u32LE)

   End Sub


   Public Shared Sub PrintCountsAndChars(bytes() As Byte, enc As Encoding)

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

      ' Display the exact character count.
      Dim iCC As Integer = enc.GetCharCount(bytes)
      Console.Write(" {0,-3}", iCC)

      ' Display the maximum character count.
      Dim iMCC As Integer = enc.GetMaxCharCount(bytes.Length)
      Console.Write(" {0,-3} :", iMCC)

      ' Decode the bytes and display the characters.
      Dim chars As Char() = enc.GetChars(bytes)
      Console.WriteLine(chars)

   End Sub

End Class


'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 : 5   12  :zăǽβ
'LE array with LE encoding : System.Text.UTF32Encoding : 5   12  :zăǽβ

Observações

Encoding.GetChars obtém caracteres a partir de uma sequência de bytes de entrada. Encoding.GetChars é diferente de Decoder.GetChars porque Encoding espera conversões discretas, enquanto Decoder é concebido para múltiplas passagens num único fluxo de entrada.

Se os dados a serem convertidos estiverem disponíveis apenas em blocos sequenciais (como dados lidos de um fluxo) ou se a quantidade de dados for tão grande que precise ser dividida em blocos menores, você deverá usar o Decoder ou o Encoder fornecidos pelo método GetDecoder ou pelo método GetEncoder, respectivamente, de uma classe derivada.

Note

Este método destina-se a operar sobre caracteres Unicode, não sobre dados binários arbitrários, como arrays de bytes. Se precisar de codificar dados binários arbitrários em texto, deve usar um protocolo como o uuencode, que é implementado por métodos como Convert.ToBase64CharArray.

O GetCharCount método determina quantos caracteres resultam na decodificação de uma sequência de bytes, e o GetChars método realiza a decodificação propriamente dita. O Encoding.GetChars método espera conversões discretas, ao contrário do Decoder.GetChars método, que lida com múltiplas passagens num único fluxo de entrada.

Várias versões de GetCharCount e GetChars são suportadas. Seguem-se algumas considerações de programação para a utilização destes métodos:

  • A sua aplicação pode precisar de decodificar múltiplos bytes de entrada a partir de uma página de código e processar esses bytes usando várias chamadas. Neste caso, provavelmente precisa de manter o estado entre chamadas, porque as sequências de bytes podem ser interrompidas quando processadas em lotes. (Por exemplo, parte de uma sequência de deslocamento ISO-2022 pode terminar uma GetChars chamada e continuar no início da chamada seguinte GetChars . Encoding.GetChars chamará a reserva para essas sequências incompletas, mas Decoder memorizará essas sequências para a chamada seguinte.)

  • Se a sua aplicação gerir as saídas das cadeias, recomenda-se usar o GetString método. Como este método deve verificar o comprimento da corda e alocar um buffer, é ligeiramente mais lento, mas o tipo resultante String é preferível.

  • A versão em bytes permite GetChars(Byte*, Int32, Char*, Int32) algumas técnicas rápidas, particularmente com múltiplas chamadas para buffers grandes. Tenha em mente, no entanto, que esta versão do método por vezes não é segura, pois são necessários ponteiros.

  • Se a sua aplicação tiver de converter uma grande quantidade de dados, deve reutilizar o buffer de saída. Neste caso, a GetChars(Byte[], Int32, Int32, Char[], Int32) versão que suporta buffers de caracteres de saída é a melhor escolha.

  • Considere usar o Decoder.Convert método em vez de GetCharCount. O método de conversão converte o máximo de dados possível e lança uma exceção se o buffer de saída for demasiado pequeno. Para a decodificação contínua de um fluxo, este método é frequentemente a melhor escolha.

Ver também

Aplica-se a

GetChars(Byte[], Int32, Int32)

Quando sobrescrito numa classe derivada, decodifica uma sequência de bytes do array de bytes especificado num conjunto de caracteres.

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

Parâmetros

bytes
Byte[]

O array de bytes que contém a sequência de bytes a decodificar.

index
Int32

O índice do primeiro byte a descodificar.

count
Int32

O número de bytes a descodificar.

Devoluções

Char[]

Um array de caracteres contendo os resultados da decodificação da sequência especificada de bytes.

Exceções

bytes é null.

index ou count é inferior a zero.

-ou-

index e count não denotam um intervalo válido em bytes.

Ocorreu um recurso de recurso (para mais informações, veja Codificação de Caracteres em .NET)

- e -

DecoderFallback está definido como DecoderExceptionFallback.

Exemplos

O exemplo seguinte codifica uma cadeia num array de bytes, e depois descodifica um intervalo desses bytes num array de caracteres.

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

*/
Imports System.Text

Public Class SamplesEncoding   

   Public Shared Sub Main()

      ' Create two instances of UTF32Encoding: one with little-endian byte order and one with big-endian byte order.
      Dim u32LE As Encoding = Encoding.GetEncoding("utf-32")
      Dim u32BE As Encoding = 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)
      Dim myStr As String = "za" & ChrW(&H0306) & ChrW(&H01FD) & ChrW(&H03B2)

      ' Encode the string using the big-endian byte order.
      ' NOTE: In VB.NET, arrays contain one extra element by default.
      '       The following line creates barrBE with the exact number of elements required.
      Dim barrBE(u32BE.GetByteCount(myStr) - 1) As Byte
      u32BE.GetBytes(myStr, 0, myStr.Length, barrBE, 0)

      ' Encode the string using the little-endian byte order.
      ' NOTE: In VB.NET, arrays contain one extra element by default.
      '       The following line creates barrLE with the exact number of elements required.
      Dim barrLE(u32LE.GetByteCount(myStr) - 1) As Byte
      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)

   End Sub


   Public Shared Sub PrintCountsAndChars(bytes() As Byte, index As Integer, count As Integer, enc As Encoding)

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

      ' Display the exact character count.
      Dim iCC As Integer = enc.GetCharCount(bytes, index, count)
      Console.Write(" {0,-3}", iCC)

      ' Display the maximum character count.
      Dim iMCC As Integer = enc.GetMaxCharCount(count)
      Console.Write(" {0,-3} :", iMCC)

      ' Decode the bytes.
      Dim chars As Char() = enc.GetChars(bytes, index, count)

      ' The following is an alternative way to decode the bytes:
      ' 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 chars(iCC - 1) As Char
      ' enc.GetChars( bytes, index, count, chars, 0 )

      ' Display the characters.
      Console.WriteLine(chars)

   End Sub

End Class


'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

Observações

Encoding.GetChars obtém caracteres a partir de uma sequência de bytes de entrada. Encoding.GetChars é diferente de Decoder.GetChars porque Encoding espera conversões discretas, enquanto Decoder é concebido para múltiplas passagens num único fluxo de entrada.

Se os dados a serem convertidos estiverem disponíveis apenas em blocos sequenciais (como dados lidos de um fluxo) ou se a quantidade de dados for tão grande que precise ser dividida em blocos menores, você deverá usar o Decoder ou o Encoder fornecidos pelo método GetDecoder ou pelo método GetEncoder, respectivamente, de uma classe derivada.

Note

Este método destina-se a operar sobre caracteres Unicode, não sobre dados binários arbitrários, como arrays de bytes. Se precisar de codificar dados binários arbitrários em texto, deve usar um protocolo como o uuencode, que é implementado por métodos como Convert.ToBase64CharArray.

O GetCharCount método determina quantos caracteres resultam na decodificação de uma sequência de bytes, e o GetChars método realiza a decodificação propriamente dita. O Encoding.GetChars método espera conversões discretas, ao contrário do Decoder.GetChars método, que lida com múltiplas passagens num único fluxo de entrada.

Várias versões de GetCharCount e GetChars são suportadas. Seguem-se algumas considerações de programação para a utilização destes métodos:

  • A sua aplicação pode precisar de decodificar múltiplos bytes de entrada a partir de uma página de código e processar esses bytes usando várias chamadas. Neste caso, provavelmente precisa de manter o estado entre chamadas, porque as sequências de bytes podem ser interrompidas quando processadas em lotes. (Por exemplo, parte de uma sequência de deslocamento ISO-2022 pode terminar uma GetChars chamada e continuar no início da chamada seguinte GetChars . Encoding.GetChars chamará a reserva para essas sequências incompletas, mas Decoder memorizará essas sequências para a chamada seguinte.)

  • Se a sua aplicação gerir as saídas das cadeias, recomenda-se usar o GetString método. Como este método deve verificar o comprimento da corda e alocar um buffer, é ligeiramente mais lento, mas o tipo resultante String é preferível.

  • A versão em bytes permite GetChars(Byte*, Int32, Char*, Int32) algumas técnicas rápidas, particularmente com múltiplas chamadas para buffers grandes. Tenha em mente, no entanto, que esta versão do método por vezes não é segura, pois são necessários ponteiros.

  • Se a sua aplicação tiver de converter uma grande quantidade de dados, deve reutilizar o buffer de saída. Neste caso, a GetChars(Byte[], Int32, Int32, Char[], Int32) versão que suporta buffers de caracteres de saída é a melhor escolha.

  • Considere usar o Decoder.Convert método em vez de GetCharCount. O método de conversão converte o máximo de dados possível e lança uma exceção se o buffer de saída for demasiado pequeno. Para a decodificação contínua de um fluxo, este método é frequentemente a melhor escolha.

Ver também

Aplica-se a