c# सी#में विशेष प्रतीकों का पता लगाएं




encoding character-encoding (2)

मैं एसी # प्रोजेक्ट पर काम कर रहा हूं जिसमें कुछ डेटा में वर्ण होते हैं जो एन्कोडिंग द्वारा मान्यता प्राप्त नहीं हैं I वे इस तरह प्रदर्शित होते हैं:

"कुछ पाठ इसमें विशेष प्रतीकों के साथ"

मेरे पास एन्कोडिंग प्रक्रिया पर कोई नियंत्रण नहीं है, डेटा भी विभिन्न मूल और विभिन्न प्रारूपों के फाइलों से आता है। मैं झंडा आंकड़ों में सक्षम होना चाहता हूं जिसमें ऐसे पात्रों को गलत या अपूर्ण रूप में शामिल किया गया हो अभी मैं उन्हें इस तरह का पता लगाने में सक्षम हूं:

if(myString.Contains("�"))
{
   //Do stuff
}

जबकि यह काम करता है, यह फ़ंक्शन शामिल में अजीब प्रतीक का उपयोग करने के लिए बिल्कुल सही नहीं लगता है। ऐसा करने के लिए कोई क्लीनर नहीं है?

संपादित करें:

फ़ाइलों को पढ़ने के लिए जिम्मेदार टीम के साथ वापस जाँचने के बाद, यह वह यह कैसे करते हैं:

var sr = new StreamReader(filePath, true);
var content = sr.ReadToEnd();

StreamReader के दूसरे पैरामीटर के रूप में true पासिंग को फ़ाइल की BOM से एन्कोडिंग का पता लगाना है, और सामग्री को पढ़ने के लिए इसका उपयोग करना है। यह हमेशा काम नहीं करता है, क्योंकि कुछ फाइलें उस जानकारी को सहन नहीं करती हैं, इसलिए उनका डेटा गलत तरीके से क्यों पढ़ा जाता है।

हमने कुछ परीक्षण किए हैं और StreamReader(filePath, Encoding.Default) का उपयोग करते हुए इसके बजाय सबसे अधिक काम करने के लिए प्रतीत होता है, अगर हमारे साथ समस्याएं नहीं थीं अपेक्षित रूप से, फ़ाइलें जो अब काम नहीं कर रहे थे, क्योंकि वे डिफ़ॉल्ट एन्कोडिंग का उपयोग नहीं करते हैं

इसलिए हमारे लिए सबसे अच्छा समाधान निम्नलिखित करना होगा: फ़ाइल को अपनी एन्कोडिंग का पता लगाने की कोशिश कर रहा है, फिर अगर वह इसे सफल नहीं कर पाता है तो इसे डिफ़ॉल्ट एन्कोडिंग के साथ फिर से पढ़ें।

हालांकि समस्या एक समान है: यदि फ़ाइल गलत तरीके से पढ़ी गई है, तो हम फ़ाइल की एन्कोडिंग का पता लगाने के बाद कैसे जांच करते हैं?


संपादित करें

मुझे एहसास हुआ कि आप वास्तव में कच्ची फाइल को किसी। NET स्ट्रिंग में लोड नहीं कर सकते हैं और अभी भी मूल फ़ाइल के बारे में पूरी जानकारी प्राप्त करने में सक्षम हैं।

परियोजना यहाँ म्लैंग एपीआई का उपयोग करती है, जो अनुमान लगाते हुए फ़ाइल को किसी नोड स्ट्रिंग में लोड नहीं करने पर बेहतर काम करती है। वहाँ भी एक संबंधित SO सवाल है


चरित्र एक विशेष प्रतीक नहीं है यह यूनिकोड रिप्लेसमेंट कैरेक्टर है I इसका अर्थ है कि कोड ने गलत कोडपेज का उपयोग करके एएससीआईआई पाठ को परिवर्तित करने की कोशिश की थी। कोडपेप में किसी भी पात्र का मिलान नहीं किया गया था

सही एन्कोडिंग का उपयोग करते हुए फ़ाइल को पढ़ने के लिए समाधान है। File विधियों या StreamReader द्वारा प्रयुक्त डिफ़ॉल्ट एन्कोडिंग UTF8 है आप उपयुक्त कन्स्ट्रक्टर का उपयोग कर एक अलग एन्कोडिंग पास कर सकते हैं, जैसे कि StreamReader(Stream, Encoding, Boolean) । सिस्टम लोकेल का कोडपेज का उपयोग करने के लिए, आपको एन्कोडिंग का उपयोग करना होगा.डिफ़ॉल्ट :

var sr = new StreamReader(filePath,Encoding.Default);    

आप BOM से यूनिकोड एन्कोडिंग को ऑटोडेट करने के लिए और एक अलग एन्कोडिंग के लिए फ़ॉलबैक को स्ट्रीमरिडर (स्ट्रीम, एन्कोडिंग, बूलियन) कन्स्ट्रक्टर का उपयोग कर सकते हैं।

फाइलों को मानते हुए कुछ प्रकार के यूनिकोड या आपके सिस्टम लोकेल से मेल खाते हैं, तो आप इसका उपयोग कर सकते हैं:

var sr = new StreamReader(filePath,Encoding.Default, true);

स्ट्रीमरिडर के स्रोत से पता चलता है कि एन्कोडिंग निर्धारित करने के लिए DetectEncoding विधि एक फ़ाइल के पहले बाइट की जांच करेगा। यदि कोई मिल गया है, तो इसका उपयोग एन्कोडिंग की जगह के बजाय किया जाता है। ऑपरेशन अतिरिक्त IO का कारण नहीं है क्योंकि विधि क्लास के आंतरिक बफ़र की जांच करती है





character-encoding