Как определить, обнаружил ли .NET StreamReader спецификацию UTF8 в базовом потоке? - PullRequest
16 голосов
/ 16 февраля 2011

Я получаю FileStream(filename,FileMode.Open,FileAccess.Read,FileShare.ReadWrite), а затем StreamReader(stream,true).

Есть ли способ проверить, начался ли поток с спецификации UTF8?Я заметил, что файлы без спецификации читаются StreamReader как UTF8.

Как я могу отличить их?

Ответы [ 3 ]

13 голосов
/ 27 февраля 2012

Вместо жесткого кодирования байтов лучше использовать 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());
}
8 голосов
/ 16 февраля 2011

Это помогает? Вы проверяете первые три байта файла:

    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();
    }
}
4 голосов
/ 16 января 2015

Вы можете определить, обнаружила ли StreamReader спецификацию, инициализировав ее с помощью кодировки UTF8 без спецификации и проверив, изменяется ли CurrentEncoding после первого чтения.

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");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...