Tôi có tài liệu XML, rất lớn (khoảng 120M) và tôi không muốn tải nó vào bộ nhớ cùng một lúc. Mục đích của tôi là kiểm tra xem tệp này có đang sử dụng mã hóa UTF-8 hợp lệ hay không.giải mã luồng tệp bằng UTF-8
Bất kỳ ý tưởng nào để kiểm tra nhanh mà không đọc toàn bộ tệp vào bộ nhớ dưới dạng byte[]
?
Tôi đang sử dụng VSTS 2008 và C#.
Khi sử dụng XMLDocument
để tải tài liệu XML, chứa chuỗi byte không hợp lệ, có ngoại lệ, nhưng khi đọc tất cả nội dung vào mảng byte và sau đó kiểm tra UTF-8, không có ngoại lệ, ý tưởng nào?
Đây là một ảnh chụp màn hình hiển thị nội dung của tập tin XML của tôi, hoặc bạn có thể tải về một bản sao của tập tin từ 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: Khi sử dụng new UTF8Encoding(true, true)
, sẽ có một ngoại lệ, nhưng khi sử dụng new UTF8Encoding(false, true)
, không có ví dụ lừa bịp. Tôi bối rối, bởi vì nó phải là tham số thứ 2 kiểm soát xem một ngoại lệ được ném (nếu có chuỗi byte không hợp lệ), tại sao tham số thứ nhất lại quan trọng?
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);
}
}
Không phải hầu như bất kỳ chuỗi byte nào, ngay cả các giá trị byte ngẫu nhiên, UTF8 hợp lệ? Hoặc có một số chuỗi giá trị byte không phải là UTF8 hợp lệ không? – ChrisW
Không phải tất cả, ngoại trừ một số ngoại lệ, vui lòng tham khảo tại đây, http://en.wikipedia.org/wiki/UTF-8#Invalid_code_points – George2
@ChrisW: Tuyệt đối không; UTF-8 có các quy tắc mã hóa cụ thể. –