如何检测 .NET StreamReader 是否在底层流上发现了 UTF8 BOM?

发布于 2024-10-17 12:00:05 字数 210 浏览 10 评论 0原文

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

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

我怎样才能区分它们?

I get a FileStream(filename,FileMode.Open,FileAccess.Read,FileShare.ReadWrite) and then a StreamReader(stream,true).

Is there a way I can check if the stream started with a UTF8 BOM?
I am noticing that files without the BOM are read as UTF8 by the StreamReader.

How can I tell them apart?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

难如初 2024-10-24 12:00:05

使用 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());
}

Rather than hardcoding the bytes, it is prettier to use the 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());
}
粉红×色少女 2024-10-24 12:00:05

您可以通过使用无 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");
    }
}

You can detect whether the StreamReader encountered a BOM by initializing it with a BOM-less UTF8 encoding and checking to see if CurrentEncoding changes after the first read.

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");
    }
}
鹿童谣 2024-10-24 12:00:05

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

    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();
    }
}

Does this help? You check the first three bytes of the file:

    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();
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文