다음을 통해 공유


UnicodeEncoding.GetPreamble 메서드

정의

이 인스턴스의 생성자가 바이트 순서 표시를 요청하는 경우 UTF-16 형식으로 인코딩된 유니코드 바이트 순서 표시를 반환합니다.

public:
 override cli::array <System::Byte> ^ GetPreamble();
public override byte[] GetPreamble ();
override this.GetPreamble : unit -> byte[]
Public Overrides Function GetPreamble () As Byte()

반환

Byte[]

UnicodeEncoding 개체가 제공하도록 구성된 경우 유니코드 바이트 순서 표시가 포함된 바이트 배열입니다. 그렇지 않으면 이 메서드는 길이가 0인 바이트 배열을 반환합니다.

예제

다음 예제에서는 메서드를 사용하여 GetPreamble 인스턴스 UnicodeEncoding에 대한 big endian 또는 little endian 바이트 순서로 유니코드 바이트 순서 표시를 검색하는 방법을 보여 줍니다.

using namespace System;
using namespace System::Text;
using namespace System::Collections;
int main()
{
   array<Byte>^byteOrderMark;
   byteOrderMark = Encoding::Unicode->GetPreamble();
   Console::WriteLine( "Default (little-endian) Unicode Preamble:" );
   IEnumerator^ myEnum = byteOrderMark->GetEnumerator();
   while ( myEnum->MoveNext() )
   {
      Byte b = safe_cast<Byte>(myEnum->Current);
      Console::Write( "[{0}]", b );
   }

   Console::WriteLine( "\n" );
   UnicodeEncoding^ bigEndianUnicode = gcnew UnicodeEncoding( true,true );
   byteOrderMark = bigEndianUnicode->GetPreamble();
   Console::WriteLine( "Big-endian Unicode Preamble:" );
   myEnum = byteOrderMark->GetEnumerator();
   while ( myEnum->MoveNext() )
   {
      Byte b = safe_cast<Byte>(myEnum->Current);
      Console::Write( "[{0}]", b );
   }
}
using System;
using System.Text;

class UnicodeEncodingExample {
    public static void Main() {
        Byte[] byteOrderMark;
        
        byteOrderMark = Encoding.Unicode.GetPreamble();
        Console.WriteLine("Default (little-endian) Unicode Preamble:");
        foreach (Byte b in byteOrderMark) {
            Console.Write("[{0}]", b);
        }
        Console.WriteLine("\n");

        UnicodeEncoding bigEndianUnicode = new UnicodeEncoding(true, true);
        byteOrderMark = bigEndianUnicode.GetPreamble();
        Console.WriteLine("Big-endian Unicode Preamble:");
        foreach (Byte b in byteOrderMark) {
            Console.Write("[{0}]", b);
        }
    }
}
Imports System.Text

Class UnicodeEncodingExample
    
    Public Shared Sub Main()
        Dim byteOrderMark() As Byte
        Dim b As Byte
        
        byteOrderMark = Encoding.Unicode.GetPreamble()
        Console.WriteLine("Default (little-endian) Unicode Preamble:")
        For Each b In  byteOrderMark
            Console.Write("[{0}]", b)
        Next b
        Console.WriteLine(ControlChars.NewLine)
        
        Dim bigEndianUnicode As New UnicodeEncoding(True, True)
        byteOrderMark = bigEndianUnicode.GetPreamble()
        Console.WriteLine("Big-endian Unicode Preamble:")
        For Each b In  byteOrderMark
            Console.Write("[{0}]", b)
        Next b
    End Sub
End Class

다음 예제에서는 두 개체 UnicodeEncoding 를 인스턴스화합니다. 그 중 첫 번째 개체는 BOM을 제공하지 않으며 두 번째 개체는 BOM을 제공하지 않습니다. 그런 다음 메서드를 GetPreamble 호출하여 유니코드로 인코딩된 문자열을 작성하기 전에 파일에 BOM을 씁니다. 예제의 콘솔 출력에서 보여 주듯이 두 번째 인코더에서 바이트를 저장하는 파일에는 첫 번째 인코더보다 3바이트가 더 있습니다.

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-16 encoding.";

      // Write a file using a Unicode encoding object without a BOM.
      var enc = new UnicodeEncoding(! BitConverter.IsLittleEndian, false);
      Byte[] bytes = enc.GetBytes(s);
      WriteToFile(@".\NoPreamble.txt", enc, bytes);

      // Use BOM.
      enc = new UnicodeEncoding(! 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 116 bytes to .\NoPreamble.txt.
//
//       Preamble has 2 bytes
//       Wrote 118 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-16 encoding."
      
      ' Write a file using the default constructor without a BOM.
      Dim enc As New UnicodeEncoding(Not BitConverter.IsLittleEndian, False)
      Dim bytes() As Byte = enc.GetBytes(s)
      WriteToFile("NoPreamble.txt", enc, bytes)

      ' Use BOM.
      enc = New UnicodeEncoding(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 116 bytes to .\NoPreamble.txt.
'
'       Preamble has 2 bytes
'       Wrote 118 bytes to .\Preamble.txt.

콘솔 창에서 명령을 사용하여 fc 파일을 비교하거나 16진수 보기 모드가 포함된 텍스트 편집기에서 파일을 검사할 수도 있습니다. UTF-16 인코딩을 지원하는 편집기에서 파일을 열면 BOM이 표시되지 않습니다.

설명

개체는 UnicodeEncoding 인코딩 프로세스에서 발생하는 바이트 시퀀스에 접두사를 지정할 수 있는 바이트 배열인 프리앰블을 제공할 수 있습니다. 바이트 순서 표시(코드 포인트 U+FEFF)를 사용하여 인코딩된 바이트 시퀀스를 앞에 두면 디코더가 바이트 순서와 변환 형식 또는 UTF를 결정하는 데 도움이 됩니다. 유니코드 바이트 순서 표시 (BOM)는 다음과 같이 serialize 됩니다 (16 진수).

  • 빅 엔디안 바이트 순서: FE FF

  • Little endian 바이트 순서: FF FE

메서드가 UnicodeEncodingGetPreamble 다음과 같은 방법으로 유효한 BOM을 반환하는 개체를 인스턴스화할 수 있습니다.

BOM은 태그가 지정되지 않았거나 부적절하게 태그가 지정된 웹 데이터 또는 비즈니스에 국제적인 문제가 없을 때 저장된 임의의 텍스트 파일과 같이 인코딩에 대한 참조가 손실된 파일에 대한 인코딩을 거의 확실하게 식별할 수 있으므로 BOM을 사용하는 것이 좋습니다. 데이터가 일관되고 적절하게 태그가 지정된 경우 사용자 문제를 방지할 수 있는 경우가 많습니다.

인코딩 유형을 제공 하는 표준의 경우 BOM은 다소 중복 됩니다. 그러나 서버에서 올바른 인코딩 헤더를 보내는 데 사용할 수 있습니다. 또는 인코딩이 손실 되는 경우 대체 방법으로 사용할 수 있습니다.

BOM을 사용 하는 경우 몇 가지 단점이 있습니다. 예를 들어 BOM을 사용 하는 데이터베이스 필드를 제한 하는 방법을 알고 있는 것은 어려울 수 있습니다. 파일의 연결은 예를 들어 불필요 한 문자가 데이터 중간에 종료 될 수 있는 방식으로 파일을 병합 하는 경우에도 문제가 될 수 있습니다. 그러나 몇 가지 단점에도 불구 하 고 BOM을 사용 하는 것이 좋습니다.

중요

인코딩된 바이트가 제대로 디코딩되도록 하려면 인코딩된 바이트 스트림의 시작 부분에 프리앰블을 접두사로 추가해야 합니다. 메서드는 GetBytes 인코딩된 바이트 시퀀스에 BOM을 앞에 두지 않습니다. 적절한 바이트 스트림의 시작 부분에 BOM을 제공하는 것은 개발자의 책임입니다.

적용 대상