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