2009-08-20 15 views
10

(माफ करना अगर यह एक शिकार है)एन्कोडिंग। डीफॉल्ट फ़ाइल.ReadAllText में कोई एन्कोडिंग जैसा नहीं है?

मैं सिर्फ एक पाठ फ़ाइल को ठीक से पढ़ने की कोशिश कर रहा एक लंबे समय खर्च किया है।

File.ReadAllText(path) साथ ही शुरू किए गए और खराब कर दिया है-अप वर्ण हो रही है, मैं File.ReadAlltext(path, Encoding) के कई वेरिएंट जिसके बाद मैं फंस गया बाहर काम करने के जो बाइट समस्या थी मेरी इनपुट फ़ाइलों का विश्लेषण करने की कोशिश कर, आदि

हताशा में की कोशिश की मैंने File.ReadAllText(path, Encoding.Default) की कोशिश की, जो काम किया!

अब मैं यह समझने के लिए संघर्ष कर रहा हूं कि डिफ़ॉल्ट मान स्पष्ट रूप से केवल डिफ़ॉल्ट मान क्यों है यदि आप इसे निर्दिष्ट करते हैं।

(मेरे कट नीचे परीक्षण स्ट्रिंग +4433ç था, मैं एएनएसआई के रूप में नोटपैड में यह बचाया - हालांकि स्विस फ्रेंच क्षेत्रीय सेटिंग ... के साथ)

+2

ध्यान दें कि Encoding.Default "डिफ़ॉल्ट" एन्कोडिंग नहीं माना जाना चाहिए - यह सिस्टम डिफ़ॉल्ट * कोडपेज के लिए (! गैर यूनिकोड) एन्कोडिंग * है। –

उत्तर

10

Encoding.Default सिस्टम के एएनएसआई कोड पृष्ठ पर है।

  • पहले यह जाँच करता है कि वहाँ एक बाइट क्रम चिह्न है, चाहे (UTF-8, UTF-16 या UTF-32):

    क्या होगा यदि आप कोई एन्कोडिंग निर्दिष्ट नहीं है File.ReadAllText करता है है। यदि वहां है, तो यह बाइट ऑर्डर मार्क में निर्दिष्ट एन्कोडिंग का उपयोग करता है।

  • अन्यथा, यह यूटीएफ -8 का उपयोग करता है।

इसलिए सिस्टम का एएनएसआई कोडपेज प्राप्त करने का एकमात्र तरीका स्पष्ट रूप से एन्कोडिंग.डिफॉल्ट निर्दिष्ट करना है।

इस विधि स्वचालित रूप से एक फ़ाइल की एन्कोडिंग का पता लगाने के

तो नहीं, यह नहीं का उपयोग कर के रूप में ही है प्रयास करता है:

+0

फ़ाइल। रीडअल्टटेक्स्ट बाइट ऑर्डर मार्क की जांच नहीं करता है। यदि आप एन्कोडिंग निर्दिष्ट नहीं करते हैं तो यह हमेशा यूटीएफ -8 का उपयोग करेगा। यह प्रतिबिंबक और .NET संदर्भ स्रोत दोनों द्वारा पुष्टि की जाती है। –

+4

जिवो, मुझे नहीं लगता कि आपकी टिप्पणी सही है। एन्कोडिंग कॉल के बिना ReadAllText ReadAllText (पथ, एन्कोडिंग.यूटीएफ 8), लेकिन ReadAllText द्वारा उपयोग की जाने वाली आंतरिक स्ट्रीम बीओएम को पढ़ेगी और पता लगाएगा एन्कोडिंग के साथ एन्कोडिंग.यूटीएफ 8 को प्रतिस्थापित करेगी। ऐसा इसलिए है क्योंकि DetEncodingFromByteOrderMarks StreamReader कन्स्ट्रक्टर में सत्य पर सेट है। –

2
MSDN, (स्ट्रिंग पथ) अधिभार स्ट्रिंग ReadAllText के बारे में से

डिफ़ॉल्ट एन्कोडिंग

3

यूटीएफ 8 वास्तविक डिफ़ॉल्ट है और इसका उपयोग तब किया जाता है जब स्वत: पहचान को कोई एन्कोडिंग नहीं मिलती है। तो बीओएम अधिक महत्वपूर्ण है। विवरण नीचे देखें:

ReadAllText(string path) - MSDN:

ReadAllText(string path, Encoding encoding) "यह पद्धति स्वचालित रूप से एन्कोडिंग का पता लगाने के लिए प्रयास करता" - MSDN:

परावर्तक उपकरण से "यह पद्धति स्वचालित रूप से एन्कोडिंग पता लगाने का प्रयास": ReadAllText(path) है ReadAllText(path, Encoding.UTF8) के समान, क्योंकि ReadAllText(path) बस ReadAllText(path, Encoding.UTF8) पर कॉल करता है। दोनों ही तरीकों से इस तरह से StreamReader बनाता है:

public StreamReader(string path, Encoding encoding) : this(path, encoding, true, 0x400) 
{ 
} 

इसका मतलब यह है कि यह सही पर सेट किया detectEncodingFromByteOrderMarks साथ StreamReader(string path, Encoding encoding, bool detectEncodingFromByteOrderMarks, int bufferSize) पैदा करता है। इसका मतलब है कि अगर बाइट ऑर्डर मार्क (बीओएम) मौजूद है तो यह बीओएम से एन्कोडिंग का उपयोग करेगा, अगर बीओएम मौजूद नहीं है तो यह उपलब्ध एन्कोडिंग का उपयोग करेगा। यदि बीओएम मौजूद नहीं है और एन्कोडिंग प्रदान नहीं की जाती है तो यह यूटीएफ 8 का उपयोग करेगी। तो UTF8 इस मामले में वास्तविक डिफ़ॉल्ट है, लेकिन याद रखें कि बीओएम सुझाए गए एन्कोडिंग से अधिक महत्वपूर्ण है।

// bom.txt is the file with BOM present. nobom.txt - witout BOM 
File.ReadAllText("bom.txt");      // use BOM 
File.ReadAllText("bom.txt", Encoding.UTF8);  // use BOM 
File.ReadAllText("bom.txt", Encoding.Default); // use BOM 
File.ReadAllText("nobom.txt");     // use UTF-8 
File.ReadAllText("nobom.txt", Encoding.UTF8); // use UTF-8 
File.ReadAllText("nobom.txt", Encoding.Default); // use system's ANSI codepage 
+0

क्या आप जानते हैं कि बीओएम को ओवरराइड करने का कोई तरीका है, ताकि एन्कोडिंग हो। जो भी प्राथमिकता बनता है? –

+0

@DanW, आप 'new StreamReader (" brokenFile.txt ", एन्कोडिंग का उपयोग करने का प्रयास कर सकते हैं। जो कुछ भी, झूठा)'। लेकिन इस मामले में यह शायद बीओएम को पाठ के रूप में पेश करेगा - इसलिए आपको शुरुआत में अजीब पात्र मिलेगा। सुनिश्चित करें कि आप क्या कर रहे हैं क्योंकि, जब बीओएम सेट होता है, तो यह आमतौर पर सही ढंग से सेट होता है। – CoperNick

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