2009-11-20 4 views
5

ठीक है, मैं यूटीएफ 8 टेक्स्ट फाइलों के साथ काम करने की कोशिश कर रहा हूं। मैं लगातार बीओएफ वर्णों से लड़ रहा हूं कि लेखक यूटीएफ 8 के लिए गिरते हैं, जो धारावाहिक और अन्य पाठ पाठकों सहित फ़ाइल को पढ़ने के लिए उपयोग करने के लिए मुझे बहुत कुछ भी उड़ाता है।यूटीएफ 8 फ़ाइल वर्णों की शुरुआत सेरियलाइज़र और पाठकों को तोड़ना

मैं डेटा की एक प्रमुख छह बाइट्स हो रही है:।

0xEF 
0xBB 
0xBF 
0xEF 
0xBB 
0xBF 

(अब है कि मैं इसे देख रहा हूँ, मुझे पता है वहाँ दो अक्षर है वहाँ है कि UTF8 बीओएफ मार्कर हूँ मैं दोगुना एन्कोडिंग? यह)?

यूटीएफ 8 पर सीरिएलाइज़र एन्कोड्स पर ध्यान दें, तो मेमोरी स्ट्रीम को यूटीएफ 8 के रूप में एक स्ट्रिंग मिलती है, तो मैं यूटीएफ 8 के साथ फाइल में स्ट्रिंग लिखता हूं ... बहुत सारी अनावश्यकता की तरह लगता है। विचार?

//I'm storing this xml result to a database field. (this one includes the BOF chars) 
using (MemoryStream ms = new MemoryStream()) 
{ 
    Utility.SerializeXml(ms, root); 
    xml = Encoding.UTF8.GetString(ms.ToArray()); 

} 


//later on, I would take that xml and then write it out to a file like this: 
File.WriteAllText(path, xml, Encoding.UTF8); 



public static void SerializeXml(Stream output, object data) 
{ 
    XmlSerializer xs = new XmlSerializer(data.GetType()); 
    XmlWriterSettings settings = new XmlWriterSettings(); 
    settings.Indent = true; 
    settings.IndentChars = "\t"; 
    settings.Encoding = Encoding.UTF8; 
    XmlWriter writer = XmlTextWriter.Create(output, settings); 
    xs.Serialize(writer, data); 
    writer.Flush(); 
    writer.Close(); 
} 

उत्तर

10

हाँ, यह दो बीओएम है। आप UTF-8 में दो बार एन्कोडिंग रहे हैं और हर बार अत्यंत दुर्भाग्यपूर्ण तथ्य यह है कि के कारण, एक छद्म बीओएम जोड़ता है:

Encoding.UTF8 

का अर्थ है "UTF-8 एक व्यर्थ के साथ, व्यर्थ U + FEFF सामने अटक अपने अनुप्रयोगों को खराब करने के लिए "।

new UTF8Encoding(false) 

का उपयोग करने का प्रयास करें, जो give you a less sucky version होना चाहिए।

+0

बिल्कुल सही! इसने मेरे प्रश्न का उत्तर दिया। मैं बीओएम के बिना फाइलें लिखने में सक्षम था। मैंने 'एनकोडिंग.यूटीएफ 8' का उपयोग करके सभी स्थानों को नए 'यूटीएफ 8 एन्कोडिंग (झूठी) 'के साथ बदल दिया। – Nathan

1

हां यह एक बीओएम है।

हाँ कुछ पुराने जेडीके की एक बग थी जो यूटीएफ -8 बीओएम डेटा पर उड़ा दी गई थी। और उनमें से दो जावा के एक आधुनिक संस्करण को भी भ्रमित कर देंगे।

मैं जिस समाधान का उपयोग करता था वह सामने की ओर पुशबैक स्ट्रीम चिपकाना था और इसे फ़िल्टर करना था।

या जावा का एक और आधुनिक संस्करण का उपयोग करें।

1

बाइट अनुक्रम 0xEF 0xBB 0xBF यू + एफईएफएफ का यूटीएफ -8 एन्कोडिंग है, जो यूनिकोड बीओएम (बाइट ऑर्डर मार्क) है। यह UTF-8 में अनावश्यक है, लेकिन यूटीएफ -16 या यूटीएफ -32 में महत्वपूर्ण है।

आपको एक ही अनुक्रम दो बार मिला है।

उनके साथ करने के लिए एकमात्र अच्छी चीज अनदेखा और/या उन्हें हटा दी गई है।

संबंधित मुद्दे