visual utf8_encode utf8 net getbytes codificar c# utf-8 filestream streamreader byte-order-mark

c# - utf8_encode - ¿Cómo puedo detectar si un.NET StreamReader encontró una lista de materiales UTF8 en la secuencia subyacente?



utf8_encode vb net (3)

¿Esto ayuda? Usted verifica los primeros tres bytes del archivo:

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

Obtengo un FileStream(filename,FileMode.Open,FileAccess.Read,FileShare.ReadWrite) y luego un StreamReader(stream,true) .

¿Hay alguna manera de verificar si la transmisión comenzó con una lista de materiales UTF8? Me doy cuenta de que los archivos sin la BOM son leídos como UTF8 por StreamReader.

¿Cómo puedo distinguirlos?


En lugar de codificar los bytes, es mejor usar la 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()); }


Puede detectar si StreamReader encontró una lista de materiales inicializándola con una codificación UTF8 sin BOM y comprobando si CurrentEncoding cambia después de la primera lectura.

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