UnicodeEncoding.GetPreamble Yöntem
Tanım
Önemli
Bazı bilgiler ürünün ön sürümüyle ilgilidir ve sürüm öncesinde önemli değişiklikler yapılmış olabilir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.
Bu örneğin oluşturucusunun bir bayt sırası işareti istemesi durumunda UTF-16 biçiminde kodlanmış bir Unicode bayt sırası işareti döndürür.
public:
override cli::array <System::Byte> ^ GetPreamble();
public override byte[] GetPreamble ();
override this.GetPreamble : unit -> byte[]
Public Overrides Function GetPreamble () As Byte()
Döndürülenler
- Byte[]
Nesne bir tane sağlayacak şekilde yapılandırılmışsa UnicodeEncoding Unicode bayt sırası işaretini içeren bir bayt dizisi. Aksi takdirde, bu yöntem sıfır uzunlukta bir bayt dizisi döndürür.
Örnekler
Aşağıdaki örnekte, bir örneği için büyük endian veya küçük endian bayt sırası içinde Unicode bayt sırası işaretini almak için yönteminin nasıl kullanılacağı GetPreamble gösterilmektedir UnicodeEncoding.
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
Aşağıdaki örnek, ilki ürün reçetesi sağlamayan, ikincisi ise sağlayan iki UnicodeEncoding nesnenin örneğini oluşturur. Ardından Unicode kodlamalı bir dize yazmadan önce BOM'u bir dosyaya yazmak için yöntemini çağırır GetPreamble . Örnekteki konsol çıkışında gösterildiği gibi, ikinci kodlayıcıdan baytları kaydeden dosyanın ilkinden üç bayt daha fazla olur.
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.
Ayrıca konsol penceresinde komutunu fc
kullanarak dosyaları karşılaştırabilir veya dosyaları Onaltılık Görünüm modu içeren bir metin düzenleyicisinde inceleyebilirsiniz. Dosya UTF-16 kodlamasını destekleyen bir düzenleyicide açıldığında BOM'un görüntülenmediğini unutmayın.
Açıklamalar
UnicodeEncoding nesnesi, kodlama işleminden kaynaklanan bayt dizisine ön ek olarak eklenebilen bir bayt dizisi olan bir ön bilgi sağlayabilir. Kodlanmış bayt dizisini bayt sırası işaretiyle (kod noktası U+FEFF) önceden belirlemek, kod çözücüye bayt sırasını ve dönüştürme biçimini veya UTF'yi belirlemeye yardımcı olur. Unicode bayt sırası işareti (BOM) aşağıdaki gibi serileştirilir (onaltılık olarak):
Büyük endian bayt sırası: FE FF
Küçük endian bayt sırası: FF FE
Yöntemi geçerli bir ürün reçetesi döndüren GetPreamble bir UnicodeEncoding nesnenin örneğini aşağıdaki yollarla oluşturabilirsiniz:
veya Encoding.BigEndianUnicode özelliği tarafından Encoding.Unicode döndürülen nesneyi alarakUnicodeEncoding.
Bir UnicodeEncoding nesnenin örneğini oluşturmak için parametresiz UnicodeEncoding() oluşturucuyu çağırarak.
true
veya UnicodeEncoding(Boolean, Boolean, Boolean) oluşturucularına bağımsız değişkenininbyteOrderMark
değeri olarak sağlayarakUnicodeEncoding(Boolean, Boolean).
Ürün reçetesini kullanmanızı öneririz; aksi takdirde etiketlenmemiş veya yanlış etiketlenmiş web verileri ya da bir işletmenin uluslararası endişeleri olmadığında depolanan rastgele metin dosyaları gibi kodlama başvurularını kaybetmiş dosyalar için neredeyse belirli bir kodlama tanımlaması sağlar. Veriler tutarlı ve düzgün etiketlenmişse genellikle kullanıcı sorunlarından kaçınılabilir.
Kodlama türü sağlayan standartlar için BOM biraz yedeklidir. Ancak, bir sunucunun doğru kodlama üst bilgisini göndermesine yardımcı olmak için kullanılabilir. Alternatif olarak, kodlamanın aksi takdirde kaybolması durumunda geri dönüş olarak kullanılabilir.
Ürün reçetesi kullanmanın bazı dezavantajları vardır. Örneğin, ürün reçetesi kullanan veritabanı alanlarının nasıl sınırlandığını bilmek zor olabilir. Dosyaların birleştirilmesi de sorun olabilir, örneğin, dosyalar gereksiz bir karakter verilerin ortasında olacak şekilde birleştirildiğinde. Ancak birkaç dezavantaja rağmen ürün reçetesi kullanılması kesinlikle önerilir.
Önemli
Kodlanmış baytların kodunun düzgün bir şekilde çözülmesini sağlamak için kodlanmış bayt akışının başına ön ek olarak bir ön ek oluşturmanız gerekir. Yöntemin bir ürün reçetesini GetBytes kodlanmış bayt dizisine eklemediğini unutmayın; uygun bayt akışının başında bir BOM sağlamak geliştiricinin sorumluluğundadır.