XML文書は非常に大きく(約120M)、すぐにメモリにロードしたくありません。私の目的は、このファイルが有効なUTF-8エンコーディングを使用しているかどうかを確認することです。UTF-8を使用してファイルストリームをデコードする
byte[]
の形式でファイル全体をメモリに読み込まずにすばやくチェックするアイデアはありますか?
私はVSTS 2008とC#を使用しています。
無効なバイトシーケンスが含まれているXMLドキュメントをロードするのにXMLDocument
を使用すると、例外がありますが、すべてのコンテンツをバイト配列に読み込んだ後、UTF-8をチェックすると例外はありません。ここで
は私のXMLファイルの内容を示すスクリーンショットである、またはあなたが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:new UTF8Encoding(true, true)
を使用している場合は例外がありますが、new UTF8Encoding(false, true)
を使用している場合はexスローされるception。例外がスローされるかどうかを制御する2番目のパラメータ(無効なバイトシーケンスがある場合)、なぜ1番目のパラメータが重要なのか、混乱していますか? George2 @
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);
}
}
ランダムなバイト値であっても、有効なUTF8でさえ、ほとんどのバイトシーケンスではありませんか?または、有効なUTF8でないバイト値シーケンスがありますか? – ChrisW
それらのすべてではなく、いくつかの例外があります。 http://en.wikipedia.org/wiki/UTF-8#Invalid_code_points – George2
@ChrisW:絶対にそうではありません。 UTF-8には特定のエンコード規則があります。 –