J'ai un document XML, ce qui est très grand (environ 120 millions), et je ne veux pas le charger dans la mémoire à la fois. Mon but est de vérifier si ce fichier utilise un codage UTF-8 valide.décoder un flux de fichiers en utilisant UTF-8
Toutes les idées pour avoir un contrôle rapide sans lire le fichier entier en mémoire sous forme de byte[]
? J'utilise VSTS 2008 et C#. Lorsque vous utilisez XMLDocument
pour charger un document XML contenant des séquences d'octets non valides, il existe une exception, mais lorsque vous lisez tout le contenu dans un tableau d'octets et que vous vérifiez par rapport à UTF-8, aucune exception, aucune idée?
Voici une capture d'écran montrant le contenu de mon fichier XML, ou vous pouvez télécharger une copie du fichier 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;
}
}
EDIT 2: Lors de l'utilisation new UTF8Encoding(true, true)
il y aura une exception, mais lors de l'utilisation new UTF8Encoding(false, true)
, il n'y a pas ex Ception jeté. Je suis confus, car il devrait être le 2ème paramètre qui contrôle si une exception est levée (s'il y a des séquences d'octets invalides), pourquoi le 1er paramètre est-il important?
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);
}
}
Est-ce que presque aucune séquence d'octets, même des valeurs d'octets aléatoires, n'est valide pour l'UTF8? Ou existe-t-il des séquences de valeurs d'octets qui ne sont pas valides UTF8? – ChrisW
Pas tous, il y a quelques exceptions, s'il vous plaît se référer ici, http://en.wikipedia.org/wiki/UTF-8#Invalid_code_points – George2
@ChrisW: Absolument pas; UTF-8 a des règles de codage spécifiques. –