Поделиться через


Encoding.GetPreamble Метод

Определение

При переопределении в производном классе возвращает последовательность байтов, задающую используемую кодировку.

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()

Возвращаемое значение

Byte[]

Массив байтов, в котором содержится последовательность байтов, задающая используемую кодировку.

-или-

Массив байтов нулевой длины, если преамбула не требуется.

Примеры

В следующем примере определяется порядок байтов кодировки на основе преамбулы.

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.
'

Комментарии

При необходимости Encoding объект предоставляет преамбулу, которая представляет собой массив байтов, которые можно предварять на последовательность байтов, полученную в результате процесса кодирования. Если преамбула содержит метку порядка байтов (в Юникоде, кодовую точку U + FEFF), она помогает декодеру определить порядок байтов и формат преобразования или кодировку UTF.

Метка порядка байтов Юникода (BOM) сериализуется следующим образом (в шестнадцатеричном формате):

  • UTF-8: EF BB BF

  • Порядковый номер UTF-16 с обратным порядком байтов: FE FF

  • UTF-16, прямой порядок байтов: FF FE

  • UTF-32. обратный порядок байтов: 00 00 FE FF

  • UTF-32, прямой порядок байтов: FF FE 00 00

Следует использовать СПЕЦИФИКАЦИю, так как она обеспечивает почти определенную идентификацию кодировки для файлов, которые в противном случае теряют ссылку на Encoding объект, например, непомеченные или неправильно помеченные веб-данные или случайные текстовые файлы, которые хранятся в том случае, если у бизнеса нет международных проблем или других данных. Часто проблемы пользователей могут быть устранены, если данные постоянно и правильно помечены тегами, желательно в UTF-8 или UTF-16.

Для стандартов, предоставляющих тип кодировки, BOM является несколько избыточным. Однако его можно использовать, чтобы помочь серверу отправить правильный заголовок кодировки. Кроме того, его можно использовать в качестве резервного, если кодировка в противном случае будет потеряна.

Существует ряд недостатков использования спецификации. Например, знание того, как ограничить поля базы данных, использующие СПЕЦИФИКАЦИю, может оказаться затруднительным. Объединение файлов может быть проблемой, например, при слиянии файлов таким образом, что ненужный символ может оказаться в середине данных. Несмотря на множество недостатков, настоятельно рекомендуется использовать СПЕЦИФИКАЦИю.

Дополнительные сведения о порядке байтов и метке порядка байтов см. в стандарте Юникода на домашней странице Юникода.

Внимание!

Чтобы обеспечить правильную декодирование закодированных байтов, следует добавить в байты префикс в формате преамбулы. Однако большинство кодировок не предоставляют преамбулы. Чтобы обеспечить правильную декодирование закодированных байтов, следует использовать кодировку Юникода, то есть,, UTF8EncodingUnicodeEncoding или UTF32Encoding , с преамбулой.

Применяется к