बाइट ऑर्डर मार्क (बीओएम) के बिना पाठ फ़ाइलों को लिखें?


116

मैं बिना BOM के, UTF8 एन्कोडिंग के साथ VB.Net का उपयोग करके एक पाठ फ़ाइल बनाने की कोशिश कर रहा हूं। क्या कोई मेरी मदद कर सकता है, यह कैसे करना है?
मैं UTF8 एन्कोडिंग के साथ फाइल लिख सकता हूं लेकिन, इससे बाइट ऑर्डर मार्क कैसे निकालें?

edit1: मैंने इस तरह कोड की कोशिश की है;

    Dim utf8 As New UTF8Encoding()
    Dim utf8EmitBOM As New UTF8Encoding(True)
    Dim strW As New StreamWriter("c:\temp\bom\1.html", True, utf8EmitBOM)
    strW.Write(utf8EmitBOM.GetPreamble())
    strW.WriteLine("hi there")
    strW.Close()

        Dim strw2 As New StreamWriter("c:\temp\bom\2.html", True, utf8)
        strw2.Write(utf8.GetPreamble())
        strw2.WriteLine("hi there")
        strw2.Close()

1. html केवल UTF8 एन्कोडिंग के साथ बनाया जाता है और 2.html ANSI एन्कोडिंग प्रारूप के साथ बनाया जाता है।

सरलीकृत दृष्टिकोण - http://whatilearnttuday.blogspot.com/2011/10/write-text-files-without-byte-order.html


8
यदि आप BOM नहीं चाहते हैं, तो आप GetPreamble () क्यों लिख रहे हैं?
हंस पसंत

जवाबों:


200

बाइट ऑर्डर मार्क (BOM) को छोड़ने के लिए, आपकी स्ट्रीम को किसी UTF8Encodingअन्य के उदाहरण का उपयोग करना होगा System.Text.Encoding.UTF8(जो BOM उत्पन्न करने के लिए कॉन्फ़िगर किया गया है)। ऐसा करने के दो आसान तरीके हैं:

1. स्पष्ट रूप से एक उपयुक्त एन्कोडिंग निर्दिष्ट करना:

  1. पैरामीटर के लिए UTF8Encodingनिर्माता को कॉल करें ।FalseencoderShouldEmitUTF8Identifier

  2. UTF8Encodingउदाहरण के लिए स्ट्रीम कंस्ट्रक्टर को पास करें ।

' VB.NET:
Dim utf8WithoutBom As New System.Text.UTF8Encoding(False)
Using sink As New StreamWriter("Foobar.txt", False, utf8WithoutBom)
    sink.WriteLine("...")
End Using
// C#:
var utf8WithoutBom = new System.Text.UTF8Encoding(false);
using (var sink = new StreamWriter("Foobar.txt", false, utf8WithoutBom))
{
    sink.WriteLine("...");
}

2. डिफ़ॉल्ट एन्कोडिंग का उपयोग करना:

यदि आप एक निर्माणकर्ता Encodingको बिल्कुल भी आपूर्ति नहीं करते हैं , तो डिफ़ॉल्ट रूप से BOM के बिना UTF8 एन्कोडिंग का उपयोग करेंगे, इसलिए निम्नलिखित को भी ठीक से काम करना चाहिए:StreamWriterStreamWriter

' VB.NET:
Using sink As New StreamWriter("Foobar.txt")
    sink.WriteLine("...")
End Using
// C#:
using (var sink = new StreamWriter("Foobar.txt"))
{
    sink.WriteLine("...");
}

अंत में, ध्यान दें कि BOM को छोड़ना केवल UTF-8 के लिए अनुमत है, UTF-16 के लिए नहीं।


हमेशा बुद्धिमान नहीं: उदाहरण के My.Computer.FileSystem.WriteAllTextलिए BOM लिखता है यदि कोई एन्कोडिंग निर्दिष्ट नहीं है।
beppe9000

My.Computer.FileSystem.WriteAllTextइस संबंध में एक अपवाद है, शायद पीछे की ओर VB संगतता के लिए अनुमान लगा रहा है? File.WriteAllTextUFT8NoBOM को चूक।
jnm2

28

इसे इस्तेमाल करे:

Encoding outputEnc = new UTF8Encoding(false); // create encoding with no BOM
TextWriter file = new StreamWriter(filePath, false, outputEnc); // open file with encoding
// write data here
file.Close(); // save and close it

6

बस, बस विधि का उपयोग WriteAllTextसे System.IO.File

कृपया File.WriteAllText से नमूने की जाँच करें ।

यह विधि एक बाइट-ऑर्डर मार्क (बीओएम) के बिना UTF-8 एन्कोडिंग का उपयोग करती है, इसलिए GetPreamble विधि का उपयोग करके एक खाली बाइट सरणी वापस आ जाएगी। यदि किसी फ़ाइल की शुरुआत में एक बाइट ऑर्डर मार्क जैसे UTF-8 पहचानकर्ता को शामिल करना आवश्यक है, तो UTF8 एन्कोडिंग के साथ WriteAllText (स्ट्रिंग, स्ट्रिंग, एन्कोडिंग) विधि अधिभार का उपयोग करें।


माई नेमस्पेस से एक BOM का उपयोग करता है
beppe9000

4

इस संबंध में दिलचस्प ध्यान दें: अजीब बात है, System.IO.File वर्ग के स्थिर "CreateText ()" विधि BOM के बिना UTF-8 फ़ाइलें बनाता है ।

सामान्य तौर पर यह बग का स्रोत होता है, लेकिन आपके मामले में यह सबसे सरल समाधान हो सकता है :)


4

यदि आप Encodingएक नया बनाते समय निर्दिष्ट नहीं करते हैं तो उपयोग StreamWriterकी जाने वाली डिफ़ॉल्ट Encodingवस्तु है UTF-8 No BOMजो कि के माध्यम से बनाई गई है new UTF8Encoding(false, true)

निर्माणकर्ताओं के बीओएम उपयोग के बिना एक पाठ फ़ाइल बनाने के लिए जिसे आपको एन्कोडिंग प्रदान करने की आवश्यकता नहीं है:

new StreamWriter(Stream)
new StreamWriter(String)
new StreamWriter(String, Boolean)

यदि मुझे निर्दिष्ट करने की आवश्यकता है तो क्या होगा leaveOpen?
बिंकी

उस स्थिति में @binki आप उपयोग करने वाले डिफ़ॉल्ट एन्कोडिंग का उपयोग नहीं कर सकते StreamWriter। आपको new UTF8Encoding(false, true)अपने एन्कोडिंग के लिए निर्दिष्ट करने की आवश्यकता होगी leaveOpenजो बीओएम को निर्दिष्ट करने और न करने में सक्षम हो ।
SD

3

मुझे लगता है कि रोमन निकितिन सही हैं। कंस्ट्रक्टर तर्क का अर्थ फ़्लिप है। मिथ्या का अर्थ BOM नहीं है और BOM का सही अर्थ है।

आपको एक ANSI एन्कोडिंग मिलती है क्योंकि BOM के बिना एक फ़ाइल जिसमें गैर-एएनएस वर्ण नहीं होते हैं, बिल्कुल ANSI फ़ाइल के समान है। आप में कुछ विशेष वर्णों की कोशिश करें "हाय वहाँ" स्ट्रिंग और आप एएनएसआई एन्कोडिंग को बिना-बीओएम में बदल देखेंगे।


1

एक्सएमएल एनकोडिंग यूटीएफ -8 बिना बीओएम के
हमें ईएमए में एक्सएमएल डेटा जमा करने की जरूरत है और उनके आवेदन जो हमारे इनपुट को लेते हैं, उन्हें बिना बीओएम के यूटीएफ -8 की आवश्यकता होती है। अरे हाँ, सादा यूटीएफ -8 सभी के लिए स्वीकार्य होना चाहिए, लेकिन ईपीए के लिए नहीं। ऐसा करने का उत्तर उपरोक्त टिप्पणियों में है। शुक्रिया रोमन निकितिन

यहाँ XML एन्कोडिंग के लिए कोड का C # स्निपेट है:

    Encoding utf8noBOM = new UTF8Encoding(false);  
    XmlWriterSettings settings = new XmlWriterSettings();  
    settings.Encoding = utf8noBOM;  
          
    using (XmlWriter xw = XmlWriter.Create(filePath, settings))  
    {  
        xDoc.WriteTo(xw);  
        xw.Flush();  
    }    

यह देखने के लिए कि क्या यह वास्तव में आउटपुट फ़ाइल से तीन प्रमुख चरित्र को हटाता है भ्रामक हो सकता है। उदाहरण के लिए, यदि आप नोटपैड ++ (www.notepad-plus-plus.org) का उपयोग करते हैं, तो यह "ANSI में एनकोड" रिपोर्ट करेगा। मुझे लगता है कि ज्यादातर टेक्स्ट एडिटर यूटीएफ -8 के बारे में बताने के लिए बीओएम पात्रों पर भरोसा कर रहे हैं। इसे स्पष्ट रूप से देखने का तरीका WinHex (www.winhex.com) जैसे बाइनरी टूल के साथ है । चूंकि मैं पहले और अंतर के बाद देख रहा था, इसलिए मैंने Microsoft WinDiff एप्लिकेशन का उपयोग किया ।


-1

हो सकता है कि आपके इनपुट टेक्स्ट में बाइट ऑर्डर मार्क हो। उस स्थिति में, आपको इसे लिखने से पहले हटा देना चाहिए।


1
कृपया मेरी सहायता करें। लिखने से पहले इसे कैसे निकालें।
विजय बलकवदे ने

@ user180326 क्या डिफ़ॉल्ट रीडर पहले से ही आपके लिए फ़िल्टर नहीं करता है?
बिंकी

-1
Dim sWriter As IO.StreamWriter = New IO.StreamWriter(shareworklist & "\" & getfilename() & ".txt", False, Encoding.Default)

आपको वे परिणाम मिलते हैं जो आप चाहते हैं (मुझे लगता है)।


1
मेरे पीसी पर यह एएनएसआई फाइलें बनाता है
मुफ्लिक्स 12
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.