Tengo un documento XML, que es muy grande (aproximadamente 120M), y no quiero cargarlo en la memoria de una vez. Mi propósito es verificar si este archivo está usando codificación UTF-8 válida.decodificar una secuencia de archivos usando UTF-8
¿Alguna idea de tener una comprobación rápida sin leer todo el archivo en la memoria en forma de byte[]
?
Estoy usando VSTS 2008 y C#.
Al utilizar XMLDocument
para cargar un documento XML, que contiene secuencias de bytes no válidas, existe una excepción, pero cuando lee todo el contenido en una matriz de bytes y luego compara con UTF-8, ¿hay alguna idea?
Aquí es una captura de pantalla que muestra el contenido de mi archivo XML, o se puede descargar una copia del archivo de here
EDIT 1:
class Program
{
public static byte[] RawReadingTest(string fileName)
{
byte[] buff = null;
try
{
FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fs);
long numBytes = new FileInfo(fileName).Length;
buff = br.ReadBytes((int)numBytes);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
return buff;
}
static void XMLTest()
{
try
{
XmlDocument xDoc = new XmlDocument();
xDoc.Load("c:\\abc.xml");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
static void Main()
{
try
{
XMLTest();
Encoding ae = Encoding.GetEncoding("utf-8");
string filename = "c:\\abc.xml";
ae.GetString(RawReadingTest(filename));
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
return;
}
}
EDITAR 2: Al usar new UTF8Encoding(true, true)
habrá una excepción, pero cuando usa new UTF8Encoding(false, true)
, no hay ningún ex ception lanzado. Estoy confundido, porque debería ser el segundo parámetro que controla si se lanza una excepción (si hay secuencias de bytes inválidas), ¿por qué importa el primer parámetro?
public static void TestTextReader2()
{
try
{
// Create an instance of StreamReader to read from a file.
// The using statement also closes the StreamReader.
using (StreamReader sr = new StreamReader(
"c:\\a.xml",
new UTF8Encoding(true, true)
))
{
int bufferSize = 10 * 1024 * 1024; //could be anything
char[] buffer = new char[bufferSize];
// Read from the file until the end of the file is reached.
int actualsize = sr.Read(buffer, 0, bufferSize);
while (actualsize > 0)
{
actualsize = sr.Read(buffer, 0, bufferSize);
}
}
}
catch (Exception e)
{
// Let the user know what went wrong.
Console.WriteLine("The file could not be read:");
Console.WriteLine(e.Message);
}
}
¿No hay casi ninguna secuencia de bytes, incluso valores de bytes aleatorios, UTF8 válido? ¿O hay algunas secuencias de valores de bytes que no son válidas UTF8? – ChrisW
No todos, hay algunas excepciones, consulte aquí, http://en.wikipedia.org/wiki/UTF-8#Invalid_code_points – George2
@ChrisW: Absolutamente no; UTF-8 tiene reglas de codificación específicas. –