我使用FileStream(filename,FileMode.Open,FileAccess.Read,FileShare.ReadWrite)
来获取一个流,然后使用StreamReader(stream,true)
。
有没有办法检查流是否以UTF8 BOM开头? 我注意到没有BOM的文件被StreamReader读取时会变成UTF8.
如何区分它们?
我使用FileStream(filename,FileMode.Open,FileAccess.Read,FileShare.ReadWrite)
来获取一个流,然后使用StreamReader(stream,true)
。
有没有办法检查流是否以UTF8 BOM开头? 我注意到没有BOM的文件被StreamReader读取时会变成UTF8.
如何区分它们?
与硬编码字节相比,使用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
,并在第一次读取后检查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");
}
}
这能帮到您吗?您需要检查文件的前三个字节:
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();
}
}
if (preamble.Where((p, i) => bytes.Length > i && p != bytes[i]).Any())
或者任何你喜欢的方式。 - Martin