2011-02-16 18 views
12

मुझे FileStream(filename,FileMode.Open,FileAccess.Read,FileShare.ReadWrite) और फिर StreamReader(stream,true) मिलता है।मैं कैसे पता लगा सकता हूं कि .NET StreamReader को अंतर्निहित स्ट्रीम पर यूटीएफ 8 बीओएम मिला है?

क्या कोई तरीका है कि मैं जांच कर सकता हूं कि स्ट्रीम यूटीएफ 8 बीओएम से शुरू हुई है या नहीं? मैं देख रहा हूं कि बीओएम के बिना फ़ाइलों को StreamReader द्वारा UTF8 के रूप में पढ़ा जाता है।

मैं उन्हें अलग कैसे बता सकता हूं?

उत्तर

7

क्या इससे मदद मिलती है?

public static void Main(string[] args) 
    { 
     FileStream fs = new FileStream("spork.txt", FileMode.Open); 
     byte[] bits = new byte[3]; 
     fs.Read(bits, 0, 3); 

     // UTF8 byte order mark is: 0xEF,0xBB,0xBF 
     if (bits[0] == 0xEF && bits[1] == 0xBB && bits[2] == 0xBF) 
     { 

     } 

     Console.ReadLine(); 
    } 
} 
+3

फ़ाइलस्ट्रीम को एक उपयोग कथन में रखना सुनिश्चित करें क्योंकि यह एक डिस्पोजेबल ऑब्जेक्ट है। – aolszowka

10

बल्कि बाइट्स हार्डकोड से, यह खूबसूरत एपीआई

public string ConvertFromUtf8(byte[] bytes) 
{ 
    var enc = new UTF8Encoding(true); 
    var preamble = enc.GetPreamble(); 
    if (preamble.Where((p, i) => p != bytes[i]).Any()) 
    throw new ArgumentException("Not utf8-BOM"); 
    return enc.GetString(bytes.Skip(preamble.Length).ToArray()); 
} 
3

उपयोग करने के लिए आप पता लगा सकते हैं के साथ आरंभ द्वारा StreamReader एक बीओएम का सामना करना पड़ा है कि क्या है: आप फ़ाइल के पहले तीन बाइट्स की जाँच एक बीओएम-कम यूटीएफ 8 एन्कोडिंग और यह देखने के लिए जांच कर रहा है कि CurrentEncoding पहले पढ़ने के बाद बदलता है या नहीं।

var utf8NoBom = new UTF8Encoding(false); 
using (var reader = new StreamReader(file, utf8NoBom)) 
{ 
    reader.Read(); 
    if (Equals(reader.CurrentEncoding, utf8NoBom)) 
    { 
     Console.WriteLine("No BOM"); 
    } 
    else 
    { 
     Console.WriteLine("BOM detected"); 
    } 
} 
+0

मैंने कभी सोचा नहीं होगा कि यह काम करेगा। धन्यवाद! यह वास्तव में बहुत बुरा है कि विपरीत सच नहीं है। आप int UTF8Encoding (सत्य) पास नहीं कर सकते हैं और इसे UTF8Encoding (झूठा) वापस कर सकते हैं। –