2009-09-16 10 views
51

मैं एक टीएफएस चेकइन नीति लिख रहा हूं, जो जांचता है कि हमारी स्रोत फाइलें हमारे फाइल हेडर वाली हैं या नहीं।विशेष वर्ण वाले एएनएसआई एन्कोडेड फ़ाइल को कैसे पढ़ा जाए

मेरी समस्या यह है कि हमारे फ़ाइल हेडर में एक विशेष वर्ण "©" होता है और दुर्भाग्य से हमारी कुछ स्रोत फ़ाइलों को एएनएसआई में एन्कोड किया जाता है। इसलिए यदि मैं नीति में इन फ़ाइलों को पढ़ता हूं, तो स्ट्रिंग इस "कॉपीराइट 200 9" की तरह दिखती है।

string content = File.ReadAllText(pendingChange.LocalItem); 

मैं स्ट्रिंग के एन्कोडिंग को बदलने के लिए थक गया, लेकिन इससे मदद नहीं मिलती है। तो मैं इन फ़ाइलों को कैसे पढ़ सकता हूं, मुझे सही स्ट्रिंग "कॉपीराइट © 200 9" मिलती है?

मदद के लिए धन्यवाद!

सादर Eny

+0

क्या आप अभी भी फाइल हेडर का उपयोग कर रहे हैं? वे कम मूल्य की प्रतीत होते हैं ... –

+0

@ मिच: स्रोत कोड में कॉपीराइट जानकारी ले जाने के बजाय आप क्या अनुशंसा करेंगे? – AnthonyWJones

+2

यह तय करने का हमारा नहीं है, यह कंपनी नीति है। – Enyra

उत्तर

101

उपयोग Encoding.Default:

string content = File.ReadAllText(pendingChange.LocalItem, Encoding.Default); 

आपको जानकारी होना चाहिए, हालांकि, जिस पर लिखा है कि यह सिस्टम डिफ़ॉल्ट एन्कोडिंग का उपयोग - जो फ़ाइल की एन्कोडिंग के रूप में ही नहीं हो सकता। एएनएसआई नामक कोई एकल एन्कोडिंग नहीं है, लेकिन आमतौर पर जब लोग "एएनएसआई एन्कोडिंग" के बारे में बात करते हैं तो उनका मतलब विंडोज कोड पेज 1252 या जो भी उनका बॉक्स उपयोग होता है।

यदि आप सटीक एन्कोडिंग का उपयोग कर सकते हैं तो आपका कोड अधिक मजबूत होगा।

+0

मुझे एन्कोडिंग के प्रस्ताव के साथ एन्कोडिंग प्रकार पता चलता है, इसके बाद यह ठीक काम करता है, धन्यवाद। – Enyra

5

अगर आपको ऐसी नीतियां मिलेंगी तो यह समझदार लगेगा कि आप टीम मानक मानक एन्कोडिंग पर भी सहमत होंगे। ईमानदार होने के लिए, मैं नहीं देख सकता कि कोई भी टीम "यूनिकोड (यूटीएफ -8 हस्ताक्षर के साथ) के अलावा एन्कोडिंग का उपयोग क्यों करेगी - कोडपेज 65001" (शायद गैर-लैटिन स्थैतिक सामग्री वाले एएसपीएक्स पृष्ठों के अलावा, लेकिन फिर भी मैं कर सकता हूं ' टी देखें कि यूटीएफ -8 का उपयोग करने के लिए यह एक बड़ा सौदा होगा)।

मान लीजिए कि आप अभी भी मिश्रित एन्कोडिंग की अनुमति देना चाहते हैं तो आपको यह निर्धारित करने के लिए एक तरीका चाहिए कि फ़ाइल को कौन सी एन्कोडिंग सहेजी गई थी ताकि आपको पता चल सके कि कौन सी एन्कोडिंग ReadAllText पर गुजरती है। फ़ाइल से इसे निर्धारित करना आसान नहीं है, हालांकि Encoding.Default का उपयोग ठीक से काम करने की संभावना है। चूंकि इसकी संभावना है कि आपके पास केवल 2 एन्कोडिंग हैं, वीएस (हस्ताक्षर के साथ यूटीएफ -8) और आपके द्वारा उपयोग की जाने वाली एक आम एएनएसआई एन्कोडिंग (संभवतः विंडोज -1252)।

इसलिए

string content = File.ReadAllText(pendingChange.LocalItem, Encoding.Default); 

का उपयोग कर काम करेंगे। (जैसा कि मैंने देखा कि जॉन पहले ही पोस्ट कर चुका है)। यह काम करता है क्योंकि जब यूटीएफ -8 बीओएम (जिसे "हस्ताक्षर" शब्द से वीएस का अर्थ है) फ़ाइल की शुरुआत में मौजूद है, तो आपूर्ति किए गए एन्कोडिंग पैरामीटर को अनदेखा किया जाता है और यूटीएफ -8 का उपयोग वैसे भी किया जाता है। इसलिए जहां यूटीएफ -8 का उपयोग करके फ़ाइल सहेजी जाती है, आपको सही परिणाम मिलते हैं और जहां एएनएसआई का उपयोग किया जाता है, आपको सबसे अच्छे परिणाम भी मिलते हैं।

बीटीडब्ल्यू यदि आप फ़ाइल शीर्षलेख संसाधित कर रहे हैं तो ReadAllLines चीजों को आसान नहीं बनायेगा?

+0

मुझे यह भी आश्चर्य है कि हमारे पास कुछ एएनएसआई एन्कोडेड फ़ाइलें क्यों हैं ^^ – Enyra

+0

एन्कोडिंग का उपयोग करने का आपका समाधान।डिफ़ॉल्ट विफल होगा हालांकि इनपुट एक यूटीएफ 8 फाइल थी, लेकिन इसमें बीओएम नहीं था (क्योंकि सभी यूटीएफ फाइलें निश्चित रूप से बीओएम के साथ नहीं आतीं)। –

+1

यह इंगित करने के लिए धन्यवाद कि फ़ाइल की शुरुआत में बीओएम पाया जाने पर भी "एन्कोडिंग.डिफॉल्ट" का उपयोग करते समय यह यूटीएफ 8 पर वापस आ जाएगा। यह मेरा दिन बचाया। – carlos357

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