décoder un flux de fichier en UTF-8

J'ai un document XML, ce qui est très grand (environ 120M), et je ne veux pas charger en mémoire à la fois. Mon but est de vérifier si ce fichier est valide à l'aide de l'encodage UTF-8.

Toutes les idées pour une vérification rapide sans avoir à lire tout le fichier en mémoire sous la forme d' byte[]?

Je suis à l'aide de VSTS 2008 et C#.

Lors de l'utilisation de XMLDocument pour charger un document XML, qui contient non valide les séquences d'octets, il y a une exception, mais lors de la lecture de tous les contenus dans un tableau d'octets et puis de vérifier, à l'encontre de l'UTF-8, il n'y a pas d'exception, des idées?

Voici une capture d'écran montrant le contenu de mon fichier XML, ou vous pouvez télécharger une copie du fichier de ici

décoder un flux de fichier en UTF-8

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 de new UTF8Encoding(true, true) il y aura une exception, mais lors de l'utilisation de new UTF8Encoding(false, true), il n'y a aucune exception n'est levée. Je suis confus, car il devrait être le 2ème paramètre qui détermine si une exception est levée (si il y a des invalides les séquences d'octets), pourquoi le 1er paramètre questions?

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

    }
  • N'est-ce pas presque tout de la séquence d'octets, même aléatoire valeurs d'octets, valide UTF8? Ou il y a quelques octets de la valeur des séquences qui ne sont pas valides UTF8?
  • Pas tous d'entre eux, il y a quelques exceptions, veuillez consulter ici, en.wikipedia.org/wiki/UTF-8#Invalid_code_points
  • Absolument pas; UTF-8 est un codage spécifique des règles.
  • Singe, je trouve que c'est très étrange que l'utilisation de XMLDocument à charge et à l'aide de BinaryReader à charger puis de contre-vérifier l'encodage UTF-8, il y aura des résultats différents. Des idées?
  • par défaut l'encodage UTF-8 utilise un remplacement de secours, RTFM.
  • veuillez voir EDIT1 section de mon post original pour trouver le contenu du fichier XML que j'utilise. Ma confusion est, XMLDocument.La méthode de chargement va le traiter comme non valide codé en UTF-8 document, mais UTF-8 TextReader va le traiter comme encodage valide (pas d'exception), les idées de ce qui est mal?
  • Lorsque vous l'Encodage.GetEncoding("utf-8"), vous obtenez un encodage avec le remplacement de secours de fonction non valide les personnages se traduit par "?" ou quelque chose comme ça. XMLDocument.Charge de toute évidence crée un encodage avec un lancer-sur-erreur de secours de la fonction.
  • votre réponse est tellement génial! 1. Avez-vous des documents (MSDN ou quelque chose ro prouver vos points)? Je veux en savoir plus sur ce sujet. 2. Donc, si je veux avoir une exception lors de l'utilisation de l'Encodage.GetEncoding, je dois définir le remplacement de secours de la fonction null?
  • 1. Voir MSDN à l'Encodage.GetEncoding(string,XxxFallback,YyyFallback), l'utilisation du réflecteur. 2. Vous ne devriez pas régler la fonction de secours pour les nuls, au mieux, vous obtiendrez quelques quelconque valeur par défaut. Ce que vous avez besoin est un DecoderExceptionFallback objet, mais l'appel à la UTF8Encoding(true,true) dans mon extrait de le crée pour vous.
  • "mais l'appel à la UTF8Encoding(true,true) dans mon extrait crée" -- qui extrait de code que tu veux dire?
  • J'ai écrit un code par moi-même, et s'il vous plaît se référer à EDIT2 section de mon post original, je l'ai essayé lors de l'utilisation de nouveaux UTF8Encoding(true, true) il y aura des exceptions, mais lors de l'utilisation de nouveaux UTF8Encoding(faux, vrai), il n'y a aucune exception n'est levée. Je suis confondu parce que ça devrait être le 2ème paramètre qui contrôle si une exception est levée lorsqu'il n'est pas valide séquences d'octets, pourquoi le 1er paramètre questions?
  • J'ai trouvé la solution sur la façon de filtrer les invalides séquences d'octets UTF-8, mais il a rencontré un nouveau problème ici, stackoverflow.com/questions/877338/where-is-leak-in-my-code apprécié si vous pouviez jeter un oeil et de partager des points de vue. 🙂

InformationsquelleAutor George2 | 2009-05-18