2008-09-26 17 views
16

के साथ XmlTextWriter का उपयोग कर एक्सएमएल फाइलों को लिखना मुझे सी # का उपयोग करके एक एक्सएमएल फाइल में नार्वेजियन अक्षरों को लिखने में समस्या हो रही है। मेरे पास एक स्ट्रिंग वेरिएबल है जिसमें कुछ नार्वेजियन टेक्स्ट (æøå जैसे अक्षरों के साथ) शामिल हैं।आईएसएल -885 9 -1 एन्कोडिंग

मैं एक XmlTextWriter का उपयोग कर एक्सएमएल लिख रहा हूँ, इस तरह एक MemoryStream करने के लिए सामग्री लिखने:

MemoryStream stream = new MemoryStream(); 
XmlTextWriter xmlTextWriter = new XmlTextWriter(stream, Encoding.GetEncoding("ISO-8859-1")); 
xmlTextWriter.Formatting = Formatting.Indented; 
xmlTextWriter.WriteStartDocument(); //Start doc 

तो मैं इस तरह मेरी नार्वे पाठ जोड़ने:

xmlTextWriter.WriteCData(myNorwegianText); 

तो मैं लिखना इस तरह डिस्क पर फ़ाइल:

FileStream myFile = new FileStream(myPath, FileMode.Create); 
StreamWriter sw = new StreamWriter(myFile); 

stream.Position = 0; 
StreamReader sr = new StreamReader(stream); 
string content = sr.ReadToEnd(); 

sw.Write(content); 
sw.Flush(); 

myFile.Flush(); 
myFile.Close(); 

अब समस्या यह है कि इस पर फ़ाइल में, सभी Norw ईज़ीन के पात्र मजाकिया लगते हैं।

मैं शायद कुछ बेवकूफ तरीके से ऊपर कर रहा हूं। इसे ठीक करने के तरीके पर कोई सुझाव?

+0

याद रखो, तुम भी नार्वे वर्ण लिखने के लिए अधिक सामान्य UTF-16 एन्कोडिंग का उपयोग कर सकते । –

उत्तर

13

आप पहले मेमोरीस्ट्रीम में एक्सएमएल क्यों लिख रहे हैं और फिर इसे वास्तविक फ़ाइल स्ट्रीम में लिख रहे हैं? यह बहुत अक्षम है। यदि आप सीधे फ़ाइलस्ट्रीम पर लिखते हैं तो इसे काम करना चाहिए।

यदि आप अभी भी डबल लिखना चाहते हैं, किसी भी कारण से, दो चीजों में से एक करें। या तो

  1. सुनिश्चित करें StreamReader और StreamWriter वस्तुओं है कि आप सभी एक आप XmlWriter के साथ इस्तेमाल किया रूप ही एन्कोडिंग का उपयोग का उपयोग करें (न सिर्फ StreamWriter, किसी और सुझाव दिया की तरह) है, या

  2. StreamReader/StreamWriter का उपयोग न करें। इसके बजाय बस एक साधारण बाइट [] और Stream.Read/Write का उपयोग करके बाइट स्तर पर स्ट्रीम की प्रतिलिपि बनाएँ। यह होने जा रहा है, बीटीडब्ल्यू, वैसे भी बहुत अधिक कुशल।

+3

मेमोरी स्ट्रीम को लिखने का एक कारण यह है कि ऐसा करने से परमाणु क्रिया उत्पन्न होती है। अधिक जानकारी के लिए इस आलेख को देखें: http://aspalliance.com/1012_how_to_write_atomic_transactions_in_net – Dscoduc

3

परिणाम फ़ाइल प्रदर्शित करने के लिए आप किस एन्कोडिंग का उपयोग करते हैं? यदि यह आईएसओ -885 9 -1 में नहीं है, तो यह सही तरीके से प्रदर्शित नहीं होगा।

उदाहरण के लिए यूटीएफ 8 के बजाय इस विशिष्ट एन्कोडिंग का उपयोग करने का कोई कारण है?

13

आपके स्ट्रीमवाइटर और आपके स्ट्रीम रीडर दोनों यूटीएफ -8 का उपयोग कर रहे हैं, क्योंकि आप एन्कोडिंग निर्दिष्ट नहीं कर रहे हैं। यही कारण है कि चीजें दूषित हो रही हैं।

जैसा कि टॉमसर ने कहा था, साथ शुरू करने के लिए एक फ़ाइलस्ट्रीम का उपयोग करना आसान होगा - लेकिन मेमोरीस्ट्रीम में आसान "WriteTo" विधि है जो आपको इसे आसानी से फ़ाइलस्ट्रीम पर कॉपी करने देती है।

मुझे उम्मीद है कि आपके असली कोड में एक उपयोग कथन है, वैसे - अगर आप इसे लिखते समय कुछ गलत हो जाते हैं तो आप अपनी फ़ाइल हैंडल को खोलना नहीं चाहते हैं।

जॉन

7

एन्कोडिंग हर बार एक स्ट्रिंग लिखने सेट या एक स्ट्रिंग के रूप बाइनरी डेटा पढ़ने की जरूरत है।

Encoding encoding = Encoding.GetEncoding("ISO-8859-1"); 

    FileStream myFile = new FileStream(myPath, FileMode.Create); 
    StreamWriter sw = new StreamWriter(myFile, encoding); 

    stream.Position = 0; 
    StreamReader sr = new StreamReader(stream, encoding); 
    string content = sr.ReadToEnd(); 

    sw.Write(content); 
    sw.Flush(); 

    myFile.Flush(); 
    myFile.Close(); 
5

ऊपर जवाब में उल्लेख किया है, सबसे बड़ी समस्या यहां Encoding, जो अनिर्दिष्ट होने के कारण चूक जा रहा है।

जब आप इस प्रकार के रूपांतरण के लिए Encoding निर्दिष्ट नहीं करते हैं, तो UTF-8 का डिफ़ॉल्ट उपयोग किया जाता है - जो आपके परिदृश्य से मेल खाता है या नहीं। आप इसे MemoryStream में दबाकर और फिर FileStream में धक्का देकर डेटा को बिना किसी रूपांतरित कर रहे हैं। एक परिणाम के रूप और भ्रष्ट अपने डेटा -

आपका मूल डेटा नहीं UTF-8 है, तो क्या यहाँ क्या होगा कि MemoryStream में पहला संक्रमण डिफ़ॉल्ट UTF-8 की Encoding का उपयोग कर डिकोड करने के लिए प्रयास करता है। जब आप FileStream पर लिखते हैं, जो डिफ़ॉल्ट रूप से एन्कोडिंग के रूप में UTF-8 का उपयोग कर रहा है, तो आप बस उस भ्रष्टाचार को फ़ाइल में बनाते रहेंगे।

समस्या को ठीक करने के लिए, आपको को Stream ऑब्जेक्ट्स में निर्दिष्ट करने की आवश्यकता है।

आप वास्तव में MemoryStream प्रक्रिया पूरी तरह से छोड़ सकते हैं, जो भी तेज़ और अधिक कुशल होगा। आपका अपडेट किया गया कोड अधिक की तरह कुछ दिख सकता है:

FileStream fs = new FileStream(myPath, FileMode.Create); 

XmlTextWriter xmlTextWriter = 
    new XmlTextWriter(fs, Encoding.GetEncoding("ISO-8859-1")); 

xmlTextWriter.Formatting = Formatting.Indented; 
xmlTextWriter.WriteStartDocument(); //Start doc 

xmlTextWriter.WriteCData(myNorwegianText); 

StreamWriter sw = new StreamWriter(fs); 

fs.Position = 0; 
StreamReader sr = new StreamReader(fs); 
string content = sr.ReadToEnd(); 

sw.Write(content); 
sw.Flush(); 

fs.Flush(); 
fs.Close(); 
+0

जबकि आप सही तरीके से वाक्यांश के तरीके से सही हैं, यह थोड़ा उलझन में है क्योंकि वह xmltextwriter में एन्कोडिंग निर्दिष्ट करता है। लेकिन जैसा कि आप कहते हैं कि उसने इसे बाद में बनाई गई नई धाराओं में सेट नहीं किया है, और इसके साथ ही यह स्रोत स्ट्रीम से नहीं पढ़ता है लेकिन डिफ़ॉल्ट को वापस करता है – MikeT

0

की जांच करने के बाद, यह है कि मेरे लिए सबसे अच्छा काम किया है:

var doc = new XDocument(new XDeclaration("1.0", "ISO-8859-1", "")); 
     using (XmlWriter writer = doc.CreateWriter()){ 
      writer.WriteStartDocument(); 
      writer.WriteStartElement("Root"); 
      writer.WriteElementString("Foo", "value"); 
      writer.WriteEndElement(); 
      writer.WriteEndDocument(); 
     } 
     doc.Save("dte.xml"); 
संबंधित मुद्दे