2011-02-16 11 views

Respuesta

7

¿Le sirve de ayuda? Se comprueba los tres primeros 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(); 
    } 
} 
+3

Asegúrese de poner el FileStream en una declaración de uso, ya que es un objeto desechable. – aolszowka

10

En lugar de codificar los bytes, que es más bonito para utilizar 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()); 
} 
3

Puede detectar si el StreamReader encontró una lista de materiales inicializando con una codificación UTF8 sin BOM y comprobación para ver 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"); 
    } 
} 
+0

Nunca hubiera pensado que esto funcionaría. ¡Gracias! Realmente es una lástima que lo opuesto no sea cierto. No puede pasar int UTF8Encoding (true) y hacer que devuelva UTF8Encoding (false). –

Cuestiones relacionadas