我得到一個FileStream(filename,FileMode.Open,FileAccess.Read,FileShare.ReadWrite)
,然後一個StreamReader(stream,true)
。如何檢測.NET StreamReader是否在基礎流上找到UTF8 BOM?
有沒有一種方法可以檢查流是否以UTF8 BOM開始? 我注意到沒有BOM的文件被StreamReader讀爲UTF8。
我該如何區分他們?
我得到一個FileStream(filename,FileMode.Open,FileAccess.Read,FileShare.ReadWrite)
,然後一個StreamReader(stream,true)
。如何檢測.NET StreamReader是否在基礎流上找到UTF8 BOM?
有沒有一種方法可以檢查流是否以UTF8 BOM開始? 我注意到沒有BOM的文件被StreamReader讀爲UTF8。
我該如何區分他們?
這有幫助嗎?你檢查的前三個字節的文件:
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();
}
}
而不是硬編碼的字節數,這是更利於使用的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());
}
您可以檢測通過對其進行初始化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");
}
}
我永遠不會認爲這會奏效。謝謝!相反的事實並非如此,這實在太糟糕了。你不能傳遞int UTF8Encoding(true)並讓它返回UTF8Encoding(false)。 – 2015-06-30 00:13:56
請確保將FileStream放入using語句中,因爲它是一次性對象。 – aolszowka 2014-12-03 13:27:18