दिलचस्प पोस्ट
उपयोग और आवश्यकता के बीच अंतर सी # में एक ऑब्जेक्ट का मेमोरी एड्रेस CLOCK_REALTIME और CLOCK_MONOTONIC के बीच का अंतर? लेआउट के साथ कुछ गलत लगता है, जेबटन विंडो के आकार में अनपेक्षित व्यवहार दिखा रहा है मैं एक नेटवर्क कनेक्शन के लिए कैसे जांच करूं? जावा में प्रयुक्त 'इंस्टॉन्सफ' ऑपरेटर क्या है? Pthread_create () द्वारा बुलाए जाने वाले कार्य करने के लिए एकाधिक तर्क? कैसे HTML में शब्द को लपेटें टेक्स्ट? Xcode से प्रोविजनिंग प्रोफाइल को कैसे निकालें MySQL क्वेरी ग्रुप द्वारा दिन / महीना / वर्ष डिफ़ॉल्ट संबद्ध प्रोग्राम के साथ फाइल कैसे खोलें क्यों उपखंड की तुलना में शार्क और मर्जुरियल में आसान विलय कर रहा है? फॉर्म सबमिट होने के बाद मैं पृष्ठभूमि में PHP स्क्रिप्ट कैसे चला सकता हूं? बैच फ़ाइल में उपयोगकर्ता द्वारा प्रदत्त इनपुट के लिए पीछे और अग्रणी व्हाइसेस्पेस को कैसे निकालना है? PHP चेतावनी: कॉल-टाइम पास-बाय-संदर्भ को बहिष्कृत कर दिया गया है

किसी भी फ़ाइल के एन्कोडिंग को खोजने के लिए प्रभावी तरीका

हां एक सबसे अधिक लगातार सवाल है, और यह मामला मेरे लिए अस्पष्ट है और जब से मुझे इसके बारे में ज्यादा जानकारी नहीं है।

लेकिन मैं एक एन्कोडिंग फाइल खोजने का एक बहुत सटीक तरीका चाहूंगा नोटपैड ++ के रूप में तो सटीक है

वेब के समाधान से एकत्रित समाधान "किसी भी फ़ाइल के एन्कोडिंग को खोजने के लिए प्रभावी तरीका"

StreamReader.CurrentEncoding संपत्ति शायद ही मेरे लिए सही पाठ फ़ाइल एन्कोडिंग देता है अपने बाइट ऑर्डर मार्क (बीओएम) का विश्लेषण करके, मेरे पास फ़ाइल की अंत्यता को निर्धारित करने में अधिक सफलता मिली है:

 /// <summary> /// Determines a text file's encoding by analyzing its byte order mark (BOM). /// Defaults to ASCII when detection of the text file's endianness fails. /// </summary> /// <param name="filename">The text file to analyze.</param> /// <returns>The detected encoding.</returns> public static Encoding GetEncoding(string filename) { // Read the BOM var bom = new byte[4]; using (var file = new FileStream(filename, FileMode.Open, FileAccess.Read)) { file.Read(bom, 0, 4); } // Analyze the BOM if (bom[0] == 0x2b && bom[1] == 0x2f && bom[2] == 0x76) return Encoding.UTF7; if (bom[0] == 0xef && bom[1] == 0xbb && bom[2] == 0xbf) return Encoding.UTF8; if (bom[0] == 0xff && bom[1] == 0xfe) return Encoding.Unicode; //UTF-16LE if (bom[0] == 0xfe && bom[1] == 0xff) return Encoding.BigEndianUnicode; //UTF-16BE if (bom[0] == 0 && bom[1] == 0 && bom[2] == 0xfe && bom[3] == 0xff) return Encoding.UTF32; return Encoding.ASCII; } 

एक तरफ नोट के रूप में, आप इसके बजाय Encoding.Default वापसी के लिए इस पद्धति की अंतिम पंक्ति को संशोधित कर सकते हैं। इसलिए डिफ़ॉल्ट रूप से ओएस के वर्तमान एएनएसआई कोड पृष्ठ के लिए एन्कोडिंग लौटा है

StreamReader वर्ग का उपयोग कर, निम्न कोड मेरे लिए ठीक काम करता है:

  using (var reader = new StreamReader(fileName, defaultEncodingIfNoBom, true)) { reader.Peek(); // you need this! var encoding = reader.CurrentEncoding; } 

चाल को Peek कॉल का उपयोग करना है, अन्यथा, .NET ने कुछ भी नहीं किया है (और यह प्रस्तावना, बीओएम) नहीं पढ़ा है। बेशक, यदि आप एन्कोडिंग की जांच करने से पहले किसी अन्य ReadXXX कॉल का उपयोग करते हैं, तो यह भी काम करता है।

अगर फ़ाइल में कोई BOM नहीं है, तो defaultEncodingIfNoBom एन्कोडिंग का उपयोग किया जाएगा। इस अधिभार पद्धति के बिना एक स्ट्रीम रीडर भी है (इस मामले में, डिफ़ॉल्ट (एएनएसआई) एन्कोडिंग को डिफ़ॉल्ट के रूप में उपयोग किया जाएगा EnncodingIfNoBom), लेकिन मैं यह तय करने की सलाह देता हूं कि आप अपने संदर्भ में डिफ़ॉल्ट एन्कोडिंग के बारे में क्या सोचते हैं।

मैंने यूटीएफ 8, यूटीएफ 16 / यूनिकोड (एलईएंडई) और यूटीएफ 32 (एलई एंड बीई) के लिए फाइलों के साथ सफलतापूर्वक इस का परीक्षण किया है। यह यूटीएफ 7 के लिए काम नहीं करता है।

मैं निम्नलिखित चरणों का प्रयास करता हूं:

1) जांचें कि क्या बाइट ऑर्डर मार्क है

2) जांचें कि फाइल वैध यूटीएफ 8 है या नहीं

3) स्थानीय "एएनएसआई" कोडपेज (एएनएसआई के रूप में माइक्रोसॉफ्ट इसे परिभाषित करता है)

चरण 2 काम करता है क्योंकि यूटीएफ 8 मान्य यूटीएफ 8 कोडपेज में अन्य गैर एएससीआईआई अनुक्रम नहीं है।

सी # के लिए यहां देखें

https://msdn.microsoft.com/en-us/library/system.io.streamreader.currentencoding%28v=vs.110%29.aspx

 string path = @"path\to\your\file.ext"; using (StreamReader sr = new StreamReader(path, true)) { while (sr.Peek() >= 0) { Console.Write((char)sr.Read()); } //Test for the encoding after reading, or at least //after the first read. Console.WriteLine("The encoding used was {0}.", sr.CurrentEncoding); Console.ReadLine(); Console.WriteLine(); } 

इसे देखो।

UDE

यह मोज़िला यूनिवर्सल वर्णसेट डिटेक्टर का एक बंदरगाह है और आप इसे इस तरह उपयोग कर सकते हैं …

 public static void Main(String[] args) { string filename = args[0]; using (FileStream fs = File.OpenRead(filename)) { Ude.CharsetDetector cdet = new Ude.CharsetDetector(); cdet.Feed(fs); cdet.DataEnd(); if (cdet.Charset != null) { Console.WriteLine("Charset: {0}, confidence: {1}", cdet.Charset, cdet.Confidence); } else { Console.WriteLine("Detection failed."); } } } 

अगर कुछ सीपीपी या एच या एमएल फाइलें आईओएस -885 9 -1 (लैटिन -1) या यूटीएफ -8 के साथ बीओएम के बिना एन्कोडिंग कर रही हैं तो निम्न कोड मेरे पावरहेल्स कोड हैं, यदि न तो यह GB18030 होने का अनुमान लगाया जाए। मैं फ्रांस में काम कर रहा हूं और एमएसवीसी फ्रेंच कंप्यूटर पर लैटिन -1 के रूप में बचाता हूं और चीनी कंप्यूटर पर जीबी के रूप में बचाता हूं, जिससे मुझे अपने सिस्टम और मेरे सहयोगियों के बीच स्रोत फ़ाइल एक्सचेंजों के दौरान एन्कोडिंग समस्या से बचने में मदद मिलती है।

जिस तरह से सरल है, अगर सभी वर्ण x00-x7e, एएससीआईआई, यूटीएफ -8 और लैटिन-1 के बीच हैं, तो सभी समान हैं, लेकिन अगर मैं यूटीएफ -8 की एक गैर एएससीआईआई फ़ाइल पढ़ता हूं, तो हम विशेष चरित्र को दिखाएंगे , तो लैटिन -1 के साथ पढ़ने की कोशिश करें लैटिन -1 में, \ x7F और \ xAF के बीच खाली है, जबकि जीबी x00-xFF के बीच पूर्ण उपयोग करती है, इसलिए अगर मैं दोनों के बीच कोई मिला, यह लैटिन-1 नहीं है

कोड PowerShell में लिखा है, लेकिन .net का उपयोग करता है इसलिए सी # या एफ # में अनुवाद करना आसान है

 $Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding($False) foreach($i in Get-ChildItem .\ -Recurse -include *.cpp,*.h, *.ml) { $openUTF = New-Object System.IO.StreamReader -ArgumentList ($i, [Text.Encoding]::UTF8) $contentUTF = $openUTF.ReadToEnd() [regex]$regex = ' ' $c=$regex.Matches($contentUTF).count $openUTF.Close() if ($c -ne 0) { $openLatin1 = New-Object System.IO.StreamReader -ArgumentList ($i, [Text.Encoding]::GetEncoding('ISO-8859-1')) $contentLatin1 = $openLatin1.ReadToEnd() $openLatin1.Close() [regex]$regex = '[\x7F-\xAF]' $c=$regex.Matches($contentLatin1).count if ($c -eq 0) { [System.IO.File]::WriteAllLines($i, $contentLatin1, $Utf8NoBomEncoding) $i.FullName } else { $openGB = New-Object System.IO.StreamReader -ArgumentList ($i, [Text.Encoding]::GetEncoding('GB18030')) $contentGB = $openGB.ReadToEnd() $openGB.Close() [System.IO.File]::WriteAllLines($i, $contentGB, $Utf8NoBomEncoding) $i.FullName } } } Write-Host -NoNewLine 'Press any key to continue...'; $null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown');