Encoding.GetPreamble Metoda

Definicja

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

Byte[]

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łą.

Dotyczy