Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何检测.NET StreamReader是否在底层流上找到UTF8 BOM?_C#_Utf 8_Filestream_Streamreader_Byte Order Mark - Fatal编程技术网

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())
或任何漂浮在船上的东西。