C# 如何检测.NET StreamReader是否在底层流上找到UTF8 BOM?
我得到一个C# 如何检测.NET StreamReader是否在底层流上找到UTF8 BOM?,c#,utf-8,filestream,streamreader,byte-order-mark,C#,Utf 8,Filestream,Streamreader,Byte Order Mark,我得到一个FileStream(文件名,FileMode.Open,FileAccess.Read,FileShare.ReadWrite)和一个StreamReader(stream,true) 是否有办法检查流是否以UTF8 BOM开始? 我注意到没有BOM表的文件被StreamReader读取为UTF8 我如何区分它们呢?这有帮助吗?检查文件的前三个字节: public static void Main(string[] args) { FileStream
FileStream(文件名,FileMode.Open,FileAccess.Read,FileShare.ReadWrite)
和一个StreamReader(stream,true)
是否有办法检查流是否以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());
}
通过使用无BOM的UTF8编码对其进行初始化,并检查
CurrentEncoding
在第一次读取后是否更改,可以检测StreamReader
是否遇到BOM
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");
}
}
确保将FileStream放入using语句中,因为它是一个一次性对象。我从未想过这会起作用。谢谢相反的情况不是真的,这真是太糟糕了。您不能传递int-UTF8Encoding(true)并让它返回UTF8Encoding(false)。@carlo-v-dango,我建议添加某种空检查,因为如果文件为空,字节可能为空
if(序言,其中((p,i)=>bytes.Length>i&&p!=bytes[i]).Any())
或任何漂浮在船上的东西。