如何检测.NET StreamReader是否在基础流上找到了UTF8 BOM?

boo*_*lub 16 c# byte-order-mark utf-8 filestream streamreader

我得到一个FileStream(filename,FileMode.Open,FileAccess.Read,FileShare.ReadWrite)然后一个StreamReader(stream,true).

有没有办法可以检查流是否以UTF8 BOM开头?我注意到没有BOM的文件被StreamReader读取为UTF8.

我怎么能分开呢?

Car*_*ngo 14

使用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());
}
Run Code Online (Sandbox Code Playgroud)


Amy*_*Amy 8

这有帮助吗?您检查文件的前三个字节:

    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();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 确保将FileStream放入using语句,因为它是一次性对象. (3认同)

Nat*_*lch 6

您可以StreamReader通过使用无 BOM 的 UTF8 编码对其进行初始化并检查CurrentEncoding第一次读取后是否发生更改来检测是否遇到 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");
    }
}
Run Code Online (Sandbox Code Playgroud)