UTF32Encoding.GetPreamble Método
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
Retornará uma marca de ordem de byte Unicode codificada no formato UTF-32, se o objeto de codificação UTF32Encoding for configurado para fornecer uma.
public:
override cli::array <System::Byte> ^ GetPreamble();
public override byte[] GetPreamble ();
override this.GetPreamble : unit -> byte[]
Public Overrides Function GetPreamble () As Byte()
Retornos
- Byte[]
Uma matriz de bytes que contém a marca de ordem de byte Unicode se o objeto UTF32Encoding é configurado para fornecer uma. Caso contrário, esse método retorna uma matriz de bytes de tamanho zero.
Exemplos
O exemplo de código a seguir recupera e exibe a marca de pedido de byte para instâncias diferentes UTF32Encoding .
using namespace System;
using namespace System::Text;
void PrintHexBytes( array<Byte>^bytes );
int main()
{
// Create instances of UTF32Encoding, with the byte order mark and without.
UTF32Encoding ^ u32LeNone = gcnew UTF32Encoding;
UTF32Encoding ^ u32BeNone = gcnew UTF32Encoding( true,false );
UTF32Encoding ^ u32LeBom = gcnew UTF32Encoding( false,true );
UTF32Encoding ^ u32BeBom = gcnew UTF32Encoding( true,true );
// Display the preamble for each instance.
PrintHexBytes( u32LeNone->GetPreamble() );
PrintHexBytes( u32BeNone->GetPreamble() );
PrintHexBytes( u32LeBom->GetPreamble() );
PrintHexBytes( u32BeBom->GetPreamble() );
}
void PrintHexBytes( array<Byte>^bytes )
{
if ( (bytes == nullptr) || (bytes->Length == 0) )
Console::WriteLine( "<none>" );
else
{
for ( int i = 0; i < bytes->Length; i++ )
Console::Write( "{0:X2} ", bytes[ i ] );
Console::WriteLine();
}
}
/*
This example displays the following output:
FF FE 00 00
<none>
FF FE 00 00
00 00 FE FF
*/
using System;
using System.Text;
public class SamplesUTF32Encoding
{
public static void Main()
{
// Create instances of UTF32Encoding, with the byte order mark and without.
UTF32Encoding u32LeNone = new UTF32Encoding();
UTF32Encoding u32BeNone = new UTF32Encoding( true, false );
UTF32Encoding u32LeBom = new UTF32Encoding( false, true );
UTF32Encoding u32BeBom = new UTF32Encoding( true, true );
// Display the preamble for each instance.
PrintHexBytes( u32LeNone.GetPreamble() );
PrintHexBytes( u32BeNone.GetPreamble() );
PrintHexBytes( u32LeBom.GetPreamble() );
PrintHexBytes( u32BeBom.GetPreamble() );
}
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 example displays the following output.
FF FE 00 00
<none>
FF FE 00 00
00 00 FE FF
*/
Imports System.Text
Public Class SamplesUTF32Encoding
Public Shared Sub Main()
' Create instances of UTF32Encoding, with the byte order mark and without.
Dim u32LeNone As New UTF32Encoding()
Dim u32BeNone As New UTF32Encoding(True, False)
Dim u32LeBom As New UTF32Encoding(False, True)
Dim u32BeBom As New UTF32Encoding(True, True)
' Display the preamble for each instance.
PrintHexBytes(u32LeNone.GetPreamble())
PrintHexBytes(u32BeNone.GetPreamble())
PrintHexBytes(u32LeBom.GetPreamble())
PrintHexBytes(u32BeBom.GetPreamble())
End Sub
Public Shared Sub PrintHexBytes(bytes() As Byte)
If bytes Is Nothing OrElse bytes.Length = 0 Then
Console.WriteLine("<none>")
Else
Dim i As Integer
For i = 0 To bytes.Length - 1
Console.Write("{0:X2} ", bytes(i))
Next i
Console.WriteLine()
End If
End Sub
End Class
'This example displays the following output:
' FF FE 00 00
' FF FE 00 00
' 00 00 FE FF
O exemplo a seguir cria uma instância de dois UTF32Encoding objetos, o primeiro dos quais não fornece um BOM e o segundo deles. Em seguida, ele chama o GetPreamble método para gravar o BOM em um arquivo antes de gravar uma cadeia de caracteres codificada em UTF-32. Como mostra a saída do exemplo, o arquivo que salva os bytes do segundo codificador tem mais quatro bytes que o primeiro.
using System;
using System.IO;
using System.Text;
public class Example
{
public static void Main()
{
String s = "This is a string to write to a file using UTF-32 encoding.";
// Write a file using the default constructor without a BOM.
var enc = new UTF32Encoding(! BitConverter.IsLittleEndian, false);
Byte[] bytes = enc.GetBytes(s);
WriteToFile(@".\NoPreamble.txt", enc, bytes);
// Use BOM.
enc = new UTF32Encoding(! BitConverter.IsLittleEndian, true);
WriteToFile(@".\Preamble.txt", enc, bytes);
}
private static void WriteToFile(String fn, Encoding enc, Byte[] bytes)
{
var fs = new FileStream(fn, FileMode.Create);
Byte[] preamble = enc.GetPreamble();
fs.Write(preamble, 0, preamble.Length);
Console.WriteLine("Preamble has {0} bytes", preamble.Length);
fs.Write(bytes, 0, bytes.Length);
Console.WriteLine("Wrote {0} bytes to {1}.", fs.Length, fn);
fs.Close();
Console.WriteLine();
}
}
// The example displays the following output:
// Preamble has 0 bytes
// Wrote 232 bytes to .\NoPreamble.txt.
//
// Preamble has 4 bytes
// Wrote 236 bytes to .\Preamble.txt.
Imports System.IO
Imports System.Text
Module Example
Public Sub Main()
Dim s As String = "This is a string to write to a file using UTF-32 encoding."
' Write a file using the default constructor without a BOM.
Dim enc As New UTF32Encoding(Not BitConverter.IsLittleEndian, False)
Dim bytes() As Byte = enc.GetBytes(s)
WriteToFile("NoPreamble.txt", enc, bytes)
' Use BOM.
enc = New UTF32Encoding(Not BitConverter.IsLittleEndian, True)
WriteToFile("Preamble.txt", enc, bytes)
End Sub
Private Sub WriteToFile(fn As String, enc As Encoding, bytes As Byte())
Dim fs As New FileStream(fn, FileMode.Create)
Dim preamble() As Byte = enc.GetPreamble()
fs.Write(preamble, 0, preamble.Length)
Console.WriteLine("Preamble has {0} bytes", preamble.Length)
fs.Write(bytes, 0, bytes.Length)
Console.WriteLine("Wrote {0} bytes to {1}.", fs.Length, fn)
fs.Close()
Console.WriteLine()
End Sub
End Module
' The example displays the following output:
' Preamble has 0 bytes
' Wrote 232 bytes to NoPreamble.txt.
'
' Preamble has 4 bytes
' Wrote 236 bytes to Preamble.txt.
Você também pode comparar os arquivos usando o fc
comando em uma janela do console ou inspecionar os arquivos em um editor de texto que inclui um modo De exibição Hex. Observe que quando o arquivo é aberto em um editor que dá suporte a UTF-32, o BOM não é exibido.
Comentários
O UTF32Encoding objeto pode fornecer um preâmbulo, que é uma matriz de bytes que podem ser prefixados na sequência de bytes resultantes do processo de codificação. A pré-criação de uma sequência de bytes codificados com uma marca de ordem de byte (pontos de código U+0000 U+FEFF) ajuda o decodificador a determinar a ordem de byte e o formato de transformação, ou UTF. A BOM (marca de ordem de byte) Unicode é serializada da seguinte maneira (em hexadecimal):
Ordem de byte de grande endian: 00 00 FE FF
Ordem de byte endian: FF FE 00 00
Você pode criar uma instância de um UTF32Encoding objeto cujo GetPreamble método retorna um BOM válido das seguintes maneiras:
Recuperando o UTF32Encoding objeto retornado pela Encoding.UTF32 propriedade.
Chamando o construtor sem UTF32Encoding() parâmetros para instanciar um UTF32Encoding objeto.
Fornecendo
true
como o valor dobyteOrderMark
argumento para os construtores e UTF32Encoding construtoresUTF32Encoding.
Recomendamos que você use o BOM, pois ele fornece quase certa identificação de uma codificação para arquivos que, de outra forma, perderam referência ao UTF32Encoding objeto, por exemplo, dados da Web não marcados ou marcados incorretamente ou arquivos de texto aleatórios armazenados quando uma empresa não tinha preocupações internacionais ou outros dados. Muitas vezes, os problemas do usuário podem ser evitados se os dados forem marcados de forma consistente e correta.
Para padrões que fornecem um tipo de codificação, uma BOM é um pouco redundante. No entanto, ele pode ser usado para ajudar um servidor a enviar o cabeçalho de codificação correto. Como alternativa, ele pode ser usado como um fallback, caso a codificação seja perdida.
Há algumas desvantagens em usar uma BOM. Por exemplo, saber como limitar os campos de banco de dados que usam uma BOM pode ser difícil. A concatenação de arquivos também pode ser um problema, por exemplo, quando os arquivos são mesclados de forma que um caractere desnecessário possa terminar no meio dos dados. No entanto, apesar das poucas desvantagens, o uso de uma BOM é altamente recomendável.
Para obter mais informações sobre a ordem de bytes e a marca de ordem de byte, consulte o padrão Unicode na Home Page Unicode.
Importante
Para garantir que os bytes codificados sejam decodificados corretamente, você deve prefixar bytes codificados com um preâmbulo. Observe que o GetBytes método não prepara um BOM para uma sequência de bytes codificados; fornecer um BOM no início de um fluxo de bytes apropriado é responsabilidade do desenvolvedor.