का उपयोग कर एक फ़ाइल स्ट्रीम डीकोड करें मेरे पास एक एक्सएमएल दस्तावेज़ है, जो बहुत बड़ा है (लगभग 120 एम), और मैं इसे एक बार में स्मृति में लोड नहीं करना चाहता हूं। मेरा उद्देश्य यह जांचना है कि यह फ़ाइल वैध यूटीएफ -8 एन्कोडिंग का उपयोग कर रही है या नहीं।यूटीएफ -8
byte[]
के रूप में पूरी फ़ाइल को स्मृति में पढ़ने के बिना कोई त्वरित जांच करने के लिए कोई विचार है?
मैं वीएसटीएस 2008 और सी # का उपयोग कर रहा हूं।
वहाँजब XMLDocument
का उपयोग कर एक XML दस्तावेज है, जो अवैध बाइट दृश्यों में शामिल है लोड करने के लिए, एक अपवाद है, लेकिन जब एक बाइट सरणी में सभी सामग्री को पढ़ने और फिर UTF-8 के खिलाफ जाँच, वहाँ कोई अपवाद नहीं है, किसी भी विचार?
यहाँ मेरी एक्सएमएल फ़ाइल की सामग्री को दिखाने वाले स्क्रीनशॉट है, या आप here
संपादित करें 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;
}
}
संपादित करें 2:new UTF8Encoding(true, true)
का उपयोग करते समय एक अपवाद होगा, लेकिन new UTF8Encoding(false, true)
का उपयोग करते समय, कोई पूर्व नहीं है ception फेंक दिया। मैं उलझन में हूं, क्योंकि यह दूसरा पैरामीटर होना चाहिए जो नियंत्रित करता है कि कोई अपवाद फेंक दिया गया है (यदि अमान्य बाइट अनुक्रम हैं), पहला पैरामीटर क्यों मायने रखता है?
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);
}
}
बाइट्स का लगभग कोई अनुक्रम नहीं है, यहां तक कि यादृच्छिक बाइट मान, मान्य यूटीएफ 8? या क्या कुछ बाइट वैल्यू अनुक्रम हैं जो वैध यूटीएफ 8 नहीं हैं? – ChrisW
उनमें से सभी, कुछ अपवाद हैं, कृपया यहां देखें, http://en.wikipedia.org/wiki/UTF-8#Invalid_code_points – George2
@ChrisW: बिलकुल नहीं; यूटीएफ -8 में विशिष्ट एन्कोडिंग नियम हैं। –