2011-02-16 87 views

回答

7

這有幫助嗎?你檢查的前三個字節的文件:

public static void Main(string[] args) 
    { 
     FileStream fs = new FileStream("spork.txt", FileMode.Open); 
     byte[] bits = new byte[3]; 
     fs.Read(bits, 0, 3); 

     // UTF8 byte order mark is: 0xEF,0xBB,0xBF 
     if (bits[0] == 0xEF && bits[1] == 0xBB && bits[2] == 0xBF) 
     { 

     } 

     Console.ReadLine(); 
    } 
} 
+3

請確保將FileStream放入using語句中,因爲它是一次性對象。 – aolszowka 2014-12-03 13:27:18

10

而不是硬編碼的字節數,這是更利於使用的API

public string ConvertFromUtf8(byte[] bytes) 
{ 
    var enc = new UTF8Encoding(true); 
    var preamble = enc.GetPreamble(); 
    if (preamble.Where((p, i) => p != bytes[i]).Any()) 
    throw new ArgumentException("Not utf8-BOM"); 
    return enc.GetString(bytes.Skip(preamble.Length).ToArray()); 
} 
3

您可以檢測通過對其進行初始化StreamReader是否遇到BOM一個無BOM的UTF8編碼,並檢查第一次讀取後CurrentEncoding是否更改。

var utf8NoBom = new UTF8Encoding(false); 
using (var reader = new StreamReader(file, utf8NoBom)) 
{ 
    reader.Read(); 
    if (Equals(reader.CurrentEncoding, utf8NoBom)) 
    { 
     Console.WriteLine("No BOM"); 
    } 
    else 
    { 
     Console.WriteLine("BOM detected"); 
    } 
} 
+0

我永遠不會認爲這會奏效。謝謝!相反的事實並非如此,這實在太糟糕了。你不能傳遞int UTF8Encoding(true)並讓它返回UTF8Encoding(false)。 – 2015-06-30 00:13:56