Encoding.GetPreamble Metoda
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Po zastąpieniu klasy pochodnej zwraca sekwencję bajtów, która określa użyte kodowanie.
public:
virtual cli::array <System::Byte> ^ GetPreamble();
public virtual byte[] GetPreamble ();
abstract member GetPreamble : unit -> byte[]
override this.GetPreamble : unit -> byte[]
Public Overridable Function GetPreamble () As Byte()
Zwraca
Tablica bajtów zawierająca sekwencję bajtów, która określa użyte kodowanie.
-lub-
Tablica bajtów o długości zero, jeśli preambuła nie jest wymagana.
Przykłady
Poniższy przykład określa kolejność bajtów kodowania na podstawie preambuły.
using namespace System;
using namespace System::Text;
int main()
{
Encoding^ unicode = Encoding::Unicode;
// Get the preamble for the Unicode encoder.
// In this case the preamblecontains the Byte order mark (BOM).
array<Byte>^preamble = unicode->GetPreamble();
// Make sure a preamble was returned
// and is large enough to contain a BOM.
if ( preamble->Length >= 2 )
{
// if (preamble->Item[0] == 0xFE && preamble->Item[1] == 0xFF)
if ( preamble[ 0 ] == 0xFE && preamble[ 1 ] == 0xFF )
{
Console::WriteLine( "The Unicode encoder is encoding in big-endian order." );
}
// else if (preamble->Item[0] == 0xFF && preamble->Item[1] == 0xFE)
else
// else if (preamble->Item[0] == 0xFF && preamble->Item[1] == 0xFE)
if ( preamble[ 0 ] == 0xFF && preamble[ 1 ] == 0xFE )
{
Console::WriteLine( "The Unicode encoder is encoding in little-endian order." );
}
}
}
/*
This code produces the following output.
The Unicode encoder is encoding in little-endian order.
*/
using System;
using System.Text;
namespace GetPreambleExample
{
class GetPreambleExampleClass
{
static void Main()
{
Encoding unicode = Encoding.Unicode;
// Get the preamble for the Unicode encoder.
// In this case the preamble contains the byte order mark (BOM).
byte[] preamble = unicode.GetPreamble();
// Make sure a preamble was returned
// and is large enough to contain a BOM.
if(preamble.Length >= 2)
{
if(preamble[0] == 0xFE && preamble[1] == 0xFF)
{
Console.WriteLine("The Unicode encoder is encoding in big-endian order.");
}
else if(preamble[0] == 0xFF && preamble[1] == 0xFE)
{
Console.WriteLine("The Unicode encoder is encoding in little-endian order.");
}
}
}
}
}
/*
This code produces the following output.
The Unicode encoder is encoding in little-endian order.
*/
Imports System.Text
Namespace GetPreambleExample
Class GetPreambleExampleClass
Shared Sub Main()
Dim [unicode] As Encoding = Encoding.Unicode
' Get the preamble for the Unicode encoder.
' In this case the preamble contains the byte order mark (BOM).
Dim preamble As Byte() = [unicode].GetPreamble()
' Make sure a preamble was returned
' and is large enough to contain a BOM.
If preamble.Length >= 2 Then
If preamble(0) = &HFE And preamble(1) = &HFF Then
Console.WriteLine("The Unicode encoder is encoding in big-endian order.")
Else
If preamble(0) = &HFF And preamble(1) = &HFE Then
Console.WriteLine("The Unicode encoder is encoding in little-endian order.")
End If
End If
End If
End Sub
End Class
End Namespace
'This code produces the following output.
'
'The Unicode encoder is encoding in little-endian order.
'
Uwagi
Encoding Opcjonalnie obiekt udostępnia preambułę, która jest tablicą bajtów, które mogą być poprzedzone sekwencją bajtów wynikających z procesu kodowania. Jeśli preambuła zawiera znak kolejności bajtów (w formacie Unicode, punkt kodu U+FEFF), pomaga dekoderowi określić kolejność bajtów i format przekształcenia lub UTF.
Znak kolejności bajtów Unicode (BOM) jest serializowany w następujący sposób (w szesnastkowym):
UTF-8: EF BB BF
UTF-16 big endian byte order: FE FF
UTF-16 little endian byte order: FF FE
UTF-32 big endian byte order: 00 00 FE FF
UTF-32 mała kolejność bajtów endian: FF FE 00 00 00
Należy użyć modelu BOM, ponieważ zapewnia niemal pewną identyfikację kodowania plików, które w przeciwnym razie utraciły odwołanie do Encoding obiektu, na przykład nieotagowane lub nieprawidłowo oznakowane dane internetowe lub losowe pliki tekstowe przechowywane, gdy firma nie miała międzynarodowych obaw ani innych danych. Często problemy użytkowników można uniknąć, jeśli dane są konsekwentnie i prawidłowo oznakowane, najlepiej w UTF-8 lub UTF-16.
W przypadku standardów zapewniających typ kodowania model BOM jest nieco nadmiarowy. Można go jednak użyć do ułatwienia serwerowi wysyłania poprawnego nagłówka kodowania. Alternatywnie można go użyć jako rezerwowego w przypadku utraty kodowania.
Istnieją pewne wady używania modelu BOM. Na przykład wiedza na temat ograniczania pól bazy danych korzystających z modelu BOM może być trudna. Łączenie plików może być również problemem, na przykład gdy pliki są scalane w taki sposób, aby niepotrzebny znak mógł znajdować się w środku danych. Pomimo kilku wad, jednak stosowanie modelu BOM jest zdecydowanie zalecane.
Aby uzyskać więcej informacji na temat kolejności bajtów i znaku zamówienia bajtów, zobacz Standard Unicode na stronie głównej Unicode.
Przestroga
Aby upewnić się, że zakodowane bajty są prawidłowo dekodowane, należy prefiks zakodowany bajty z preambułą. Jednak większość kodowań nie zapewnia preambuły. Aby upewnić się, że zakodowane bajty są prawidłowo dekodowane, należy użyć kodowania Unicode, czyli , UTF8EncodingUnicodeEncodinglub UTF32Encoding, z preambułą.