MacRoman, CP1252, लैटिन 1, UTF-8 और ASCII के बीच एन्कोडिंग का अनुमान कैसे लगाएं


99

काम में ऐसा लगता है कि कोई भी सप्ताह कभी भी कुछ एन्कोडिंग-संबंधित धारणा, आपदा या तबाही के बिना नहीं गुजरता है। समस्या आमतौर पर प्रोग्रामर से निकलती है, जो सोचते हैं कि वे एन्कोडिंग को निर्दिष्ट किए बिना "पाठ" फ़ाइल को मज़बूती से संसाधित कर सकते हैं। लेकिन आप नहीं कर सकते।

इसलिए यह कभी भी उन नामों से मना करने वाली फाइलों के लिए तय किया गया है जो अंत में *.txtया इनमें से नाम रखते हैं *.text। सोच यह है कि ये एक्सटेंशन कैज़ुअल प्रोग्रामर को एन्कोडिंग के बारे में सुस्त शालीनता में गुमराह करते हैं, और इससे अनुचित हैंडलिंग होती है। लगभग कोई विस्तार नहीं करना बेहतर होगा, क्योंकि कम से कम तब आप जानते हैं कि आपको नहीं पता कि आपको क्या मिला है।

हालाँकि, हम उस तक जाने के लिए गोइंट नहीं हैं। इसके बजाय आपसे एन्कोडिंग में समाप्त होने वाले फ़ाइल नाम का उपयोग करने की अपेक्षा की जाएगी। पाठ फ़ाइलों के लिए तो, उदाहरण के लिए, इस तरह के कुछ होगा README.ascii, README.latin1, README.utf8, आदि

उन फ़ाइलों के लिए जो एक विशेष विस्तार की मांग करते हैं, यदि कोई फ़ाइल के अंदर एन्कोडिंग को निर्दिष्ट कर सकता है, जैसे कि पर्ल या पायथन में, तो आप ऐसा करेंगे। जावा स्रोत जैसी फ़ाइलों के लिए, जहां फ़ाइल में ऐसी कोई सुविधा आंतरिक रूप से मौजूद नहीं है, आप एन्कोडिंग को एक्सटेंशन से पहले रख देंगे, जैसे कि SomeClass-utf8.java

आउटपुट के लिए, UTF-8 को दृढ़ता से पसंद किया जाना है।

लेकिन इनपुट के लिए, हमें यह पता लगाने की आवश्यकता है कि हमारे कोडबेस में हजारों फाइलों से कैसे निपटें *.txt। हम अपने नए मानक में फिट होने के लिए उन सभी का नाम बदलना चाहते हैं। लेकिन हम संभवतः उन सभी को नहीं देख सकते। इसलिए हमें एक पुस्तकालय या कार्यक्रम की आवश्यकता है जो वास्तव में काम करता है।

ये ASCII, ISO-8859-1, UTF-8, Microsoft CP1252 या Apple MacRoman में विभिन्न हैं। यद्यपि हम जानते हैं कि हम बता सकते हैं कि क्या कुछ ASCII है, और हम यह जानने के लिए एक अच्छा बदलाव रखते हैं कि क्या कुछ UTF-8 है, तो हम 8-बिट एनकोडिंग के बारे में चिंतित हैं। क्योंकि हम एक मिश्रित यूनिक्स वातावरण (सोलारिस, लिनक्स, डार्विन) में चल रहे हैं, जिसमें अधिकांश डेस्कटॉप मैक हैं, हमारे पास काफी कष्टप्रद MacRoman फाइलें हैं। और ये विशेष रूप से एक समस्या है।

कुछ समय के लिए अब मैं प्रोग्रामेटिकली यह निर्धारित करने का तरीका ढूंढ रहा हूं कि कौन सा है

  1. ASCII
  2. ISO-8859-1
  3. CP1252
  4. MacRoman
  5. UTF-8

एक फ़ाइल में है, और मुझे एक प्रोग्राम या लाइब्रेरी नहीं मिला है जो उन तीन अलग-अलग 8-बिट एन्कोडिंग के बीच मज़बूती से अंतर कर सकता है। हमारे पास अकेले एक हजार से अधिक MacRoman फाइलें हैं, इसलिए हम जो भीसेट डिटेक्टर का उपयोग करते हैं, उन्हें उन लोगों को सूँघने में सक्षम होना चाहिए। कुछ भी नहीं जो मैंने देखा है वह चाल को प्रबंधित कर सकता है। मुझे ICU चारसेट डिटेक्टर लाइब्रेरी की बड़ी उम्मीदें थीं , लेकिन यह MacRoman को नहीं संभाल सकता। मैंने पर्ल और पायथन दोनों में समान काम करने के लिए मॉड्यूल को भी देखा है, लेकिन बार-बार यह हमेशा एक ही कहानी है: मैकरोमन का पता लगाने के लिए कोई समर्थन नहीं।

इसलिए मैं जो खोज रहा हूं वह एक मौजूदा पुस्तकालय या कार्यक्रम है जो मज़बूती से यह निर्धारित करता है कि उन पाँच एन्कोडिंग में से एक फ़ाइल किसमें है - और उससे अधिक अधिमानतः। विशेष रूप से इसे तीन 3-बिट एन्कोडिंग के बीच अंतर करना होगा जो मैंने उद्धृत किया है, विशेष रूप से मैकरोमन । फाइलें 99% से अधिक अंग्रेजी भाषा के पाठ हैं; अन्य भाषाओं में कुछ हैं, लेकिन कई नहीं हैं।

यदि यह लाइब्रेरी कोड है, तो हमारी भाषा प्राथमिकता इसके लिए पर्ल, सी, जावा या पायथन और उस क्रम में होना है। यदि यह सिर्फ एक कार्यक्रम है, तो हम वास्तव में परवाह नहीं करते हैं कि यह किस भाषा में है, जब तक यह पूर्ण स्रोत में आता है, यूनिक्स पर चलता है, और पूरी तरह से अनएन्कर्ड है।

क्या किसी और की इस समस्या का एक ज़िलिन विरासत पाठ फ़ाइलों को बेतरतीब ढंग से एन्कोड किया गया है? यदि हां, तो आपने इसे कैसे हल करने का प्रयास किया, और आप कितने सफल रहे? यह मेरे प्रश्न का सबसे महत्वपूर्ण पहलू है, लेकिन मुझे इस बात में भी दिलचस्पी है कि क्या आपको लगता है कि प्रोग्रामर को अपनी फ़ाइलों को नाम देने (या नाम बदलने) के लिए प्रोत्साहित करना है, जो कि उन फ़ाइलों को वास्तविक एन्कोडिंग के साथ हैं जो भविष्य में समस्या से बचने में हमारी मदद करेंगे। क्या किसी ने कभी इसे संस्थागत आधार पर लागू करने की कोशिश की है, और यदि ऐसा है, तो क्या वह सफल था या नहीं और क्यों?

और हां, मैं पूरी तरह से समझता हूं कि कोई समस्या की प्रकृति को देखते हुए निश्चित उत्तर की गारंटी क्यों नहीं दे सकता। यह विशेष रूप से छोटी फ़ाइलों के साथ होता है, जहां आपके पास जाने के लिए पर्याप्त डेटा नहीं है। सौभाग्य से, हमारी फाइलें शायद ही कभी छोटी होती हैं। यादृच्छिक READMEफ़ाइल के अलावा , अधिकांश 50k से 250k के आकार की सीमा में हैं, और कई बड़े हैं। आकार में कुछ K से अधिक कुछ भी अंग्रेजी में होने की गारंटी है।

समस्या डोमेन बायोमेडिकल टेक्स्ट माइनिंग है, इसलिए हम कभी-कभी व्यापक और बेहद बड़े कॉर्पोरा से निपटते हैं, जैसे कि PubMedCentral के सभी ओपन एक्सेस रिस्पॉन्सरी। 5.7 गीगाबाइट पर एक बड़ी फ़ाइल बायोटेसोरस 6.0 है। यह फ़ाइल विशेष रूप से कष्टप्रद है क्योंकि यह लगभग सभी UTF-8 है। हालाँकि, कुछ संख्याबेकुल गए और इसमें कुछ पंक्तियाँ अटक गईं जो कि कुछ 8-बिट एन्कोडिंग में हैं- Microsoft CP1252, मेरा मानना ​​है। इससे पहले कि आप उस पर यात्रा करें, इसमें काफी समय लगता है। :(


एक समाधान के लिए stackoverflow.com/questions/4255305/… देखें
mpenkov

जवाबों:


86

सबसे पहले, आसान मामलों:

ASCII

यदि आपके डेटा में 0x7F से ऊपर कोई बाइट्स नहीं हैं, तो यह ASCII है। (या 7-बिट ISO646 एन्कोडिंग, लेकिन वे बहुत अप्रचलित हैं।)

UTF-8

यदि आपका डेटा पुष्टि UTF-8 के रूप में है, तो आप सुरक्षित रूप से ग्रहण कर सकते हैं यह है UTF-8। UTF-8 के सख्त सत्यापन नियमों के कारण, झूठी सकारात्मक अत्यंत दुर्लभ हैं।

आईएसओ-8859-1 बनाम विंडोज़ -1252

इन दोनों एन्कोडिंगों के बीच एकमात्र अंतर यह है कि ISO-8859-1 में C1 नियंत्रण वर्ण हैं जहां विंडोज़ -1252 में मुद्रण योग्य वर्ण € ‚ƒ two है ... † two two two ŒŽ '' '' • • – • ™ š> œžŸ। मैंने बहुत सी फाइलें देखी हैं जो घुंघराले उद्धरण या डैश का उपयोग करती हैं, लेकिन कोई भी जो C1 नियंत्रण वर्णों का उपयोग नहीं करता है। तो उनके साथ भी परेशान न हों, या ISO-8859-1, इसके बजाय बस windows-1252 का पता लगाएं।

यह अब आपको केवल एक प्रश्न के साथ छोड़ देता है।

आप MacRoman को cp1252 से कैसे अलग करते हैं?

यह बहुत पेचीदा मामला है।

अपरिभाषित वर्ण

बाइट्स 0x81, 0x8D, 0x8F, 0x90, 0x9D का उपयोग विंडो -1252 में नहीं किया जाता है। यदि वे होते हैं, तो मान लें कि डेटा MacRoman है।

पहचान के पात्र

बाइट्स 0xA2 (¢), 0xA3 (£), 0xA9 (©), 0xB1 (B), 0xB5 (µ) दोनों एन्कोडिंग में समान होते हैं। यदि ये केवल गैर-ASCII बाइट्स हैं, तो इससे कोई फर्क नहीं पड़ता कि आप MacRoman या cp1252 चुनते हैं।

सांख्यिकीय दृष्टिकोण

काउंट कैरेक्टर (बाइट नहीं!) आपके द्वारा यूटीएफ -8 होने के आंकड़ों में बारंबारता। सबसे लगातार अक्षर निर्धारित करें। फिर इस डेटा का उपयोग यह निर्धारित करने के लिए करें कि cp1252 या MacRoman वर्ण अधिक सामान्य हैं या नहीं।

उदाहरण के लिए, एक खोज में मैंने सिर्फ 100 यादृच्छिक अंग्रेजी विकिपीडिया लेखों पर प्रदर्शन किया, सबसे आम गैर-एएससीआईआई अक्षर हैं ·•–é°®’èö—। इस तथ्य के आधार पर,

  • बाइट्स 0x92, 0x95, 0x96, 0x97, 0xAE, 0xB0, 0xB7, 0xE8, 0xE9, या 0xF6 विंडोज़ -1252 का सुझाव देते हैं।
  • बाइट्स 0x8E, 0x8F, 0x9A, 0xA1, 0xA5, 0xA8, 0xD0, 0xD1, 0xD5, या 0xE1 MacRoman का सुझाव देते हैं।

Cp1252- सुझाव देने वाले बाइट और मैकरोमन-सुझाव बाइट्स की गणना करें, और जो भी सबसे बड़ा हो, उसके साथ जाएं।


6
मैंने आपके उत्तर को स्वीकार कर लिया है क्योंकि किसी ने भी बेहतर प्रस्तुत नहीं किया है, और आपने उन मुद्दों को लिखने में अच्छा काम किया है जिनके साथ मैं छेड़छाड़ कर रहा था। मेरे पास वास्तव में उन बाइट्स को सूँघने के कार्यक्रम हैं, हालांकि आपके पास लगभग दोगुनी संख्या है जो मैं खुद के साथ आया था।
tchrist 12

10
अंत में इसे लागू करने के लिए चारों ओर हो गया। विकिपीडिया से पता चलता है कि अच्छा प्रशिक्षण डेटा नहीं है। 1k यादृच्छिक en.wikipedia लेखों से, LANGUAGES अनुभाग की गिनती नहीं करते हुए, मुझे 50k unASCII कोडपॉइंट मिले, लेकिन वितरण विश्वसनीय नहीं है: मध्य डॉट और बुलेट बहुत अधिक हैं, और c & c & c। इसलिए मैंने सभी-UTF8 PubMed ओपन एक्सेस कॉर्पस, माइनिंग + 14M unASCII कोडपॉइंट्स का उपयोग किया। मैं इनका उपयोग सभी 8-बिट एन्कोडिंग के सापेक्ष-आवृत्ति वाले मॉडल को बनाने में करता हूं, जो आपकी तुलना में कट्टर हैं लेकिन उस विचार पर आधारित हैं। यह बायोमेडिकल ग्रंथों, लक्ष्य डोमेन के लिए एन्कोडिंग का अत्यधिक पूर्वानुमान साबित होता है । मुझे इसे प्रकाशित करना चाहिए। धन्यवाद!
tchrist

5
मेरे पास अभी भी कोई MacRoman फाइलें नहीं हैं, लेकिन सीआर का उपयोग नहीं होगा क्योंकि लाइन सीमांकक एक उपयोगी परीक्षण प्रदान करता है। यह मैक ओएस के पुराने संस्करणों के लिए काम करेगा, हालांकि मुझे ओएस 9 के बारे में नहीं पता है।
मिलिअज़

10

अधिक प्रलेखन यहाँ पाया जाता है: mozilla.org/projects/intl/detectorrc.html , वहाँ से, यह सुझाव है कि यदि आप डॉक्स में खुदाई करते हैं तो आप समर्थित चार्ट पा सकते हैं
जोएल बर्जर

@Joel: मैंने स्रोत में खोदा है। यह एक लफ्फाजी वाला सवाल था। x-mac-cyrillicसमर्थित है, x-mac-hebrewटिप्पणी में लंबाई पर चर्चा की है, x-mac-anything-elseएक उल्लेख नहीं मिलता है।
जॉन मैकिन

@ जॉन माचिन: ​​अजीब है कि सिरिलिक और हेब्रॉव को एक नोड मिलता है, लेकिन कुछ और नहीं। मैं केवल एक और प्रलेखन स्रोत में टॉस कर रहा था, मैंने आगे नहीं पढ़ा था, ऐसा करने के लिए धन्यवाद!
जोएल बर्जर ने

7

इस तरह के एक अनुमान पर मेरा प्रयास (यह मानते हुए कि आपने ASCII और UTF-8 को खारिज कर दिया है):

  • यदि 0x7f से 0x9f बिल्कुल दिखाई नहीं देते हैं, तो यह संभवतः ISO-8859-1 है, क्योंकि वे बहुत कम उपयोग किए गए नियंत्रण कोड हैं।
  • यदि 0x94 के माध्यम से 0x91 बहुत दिखाई देता है, तो यह शायद विंडोज -1252 है, क्योंकि वे "स्मार्ट कोट्स" हैं, अब तक उस श्रेणी के सबसे अधिक संभावित अक्षर अंग्रेजी पाठ में उपयोग किए जाने वाले हैं। अधिक निश्चित होने के लिए, आप जोड़े की तलाश कर सकते हैं।
  • अन्यथा, यह MacRoman है, खासकर यदि आप 0xd5 के माध्यम से 0xd2 का बहुत कुछ देखते हैं (यह वह जगह है जहां टाइपोग्राफिक उद्धरण MacRoman में हैं)।

पक्षीय लेख:

जावा स्रोत जैसी फ़ाइलों के लिए जहां इस तरह की कोई सुविधा फ़ाइल में मौजूद नहीं है, आप एन्कोडिंग को एक्सटेंशन से पहले रख देंगे, जैसे कि SomeClass-utf8.java

यह मत करो!!

जावा कंपाइलर वर्ग नामों से मेल करने के लिए फ़ाइल नामों की अपेक्षा करता है, इसलिए फ़ाइलों का नाम बदलने से स्रोत कोड असंगत हो जाएगा। सही बात एन्कोडिंग का अनुमान लगाने के लिए होगी, फिर native2asciiसभी गैर-एएससीआईआई पात्रों को यूनिकोड से बचने के अनुक्रम में बदलने के लिए उपकरण का उपयोग करें ।


7
मूर्खतापूर्ण कोमपिलोर! नहीं, हम लोगों को यह नहीं बता सकते कि वे केवल ASCII का उपयोग कर सकते हैं; यह किसी भी अधिक 1960 के दशक नहीं है। यह एक समस्या नहीं होती अगर कोई @encoding एनोटेशन होता, ताकि तथ्य एक विशेष एन्कोडिंग में हो, स्रोत कोड के लिए बाहरी रूप से संग्रहीत नहीं किया जा सकता था, जावा के एक बहुत ही मूर्खतापूर्ण कमी है जो न तो पर्ल और न ही पायथन से आती है। । यह स्रोत में होना चाहिए। हालांकि यह हमारी मुख्य समस्या नहीं है; यह *.textफ़ाइलों की अधिकतम है।
21

3
@tchrist: यह वास्तव में ऐसा एनोटेशन का समर्थन करने के लिए अपना एनोटेशन प्रोसेसर लिखने के लिए कठिन नहीं है। अभी भी एक शर्मनाक निरीक्षण मानक एपीआई में नहीं है।
माइकल बोर्गवर्ड

यहां तक ​​कि अगर Java ने @encoding का समर्थन किया, तो यह एन्कोडिंग घोषणा को सही नहीं बनाएगा ।
dan04

4
@ dan04: आप XML, HTML या अन्य कहीं भी एन्कोडिंग घोषणा के बारे में कह सकते हैं। लेकिन उन उदाहरणों की तरह, यदि इसे मानक एपीआई में परिभाषित किया गया था, तो अधिकांश उपकरण जो स्रोत कोड (विशेष रूप से संपादकों और आईडीई) के साथ काम करते हैं, वे इसका समर्थन करेंगे, जो उन लोगों को गलती से फ़ाइलों को बनाने से रोक देगा जिनकी सामग्री एन्कोडिंग से मेल नहीं खाती है घोषणा।
माइकल बोर्गवर्ड

4
"जावा कंपाइलर को क्लास के नामों से मेल करने के लिए फ़ाइल नाम की उम्मीद है।" यह नियम केवल तभी लागू होता है जब फ़ाइल एक शीर्ष-स्तरीय सार्वजनिक वर्ग को परिभाषित करती है।
मैथ्यू फ्लैशेन

6

"पर्ल, सी, जावा, या पायथन, और उस क्रम में": दिलचस्प रवैया :-)

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

UTF-8 रणनीतियाँ (कम से कम पसंदीदा भाषा में):

# 100% Unicode-standard-compliant UTF-8
def utf8_strict(text):
    try:
        text.decode('utf8')
        return True
    except UnicodeDecodeError:
        return False

# looking for almost all UTF-8 with some junk
def utf8_replace(text):
    utext = text.decode('utf8', 'replace')
    dodgy_count = utext.count(u'\uFFFD') 
    return dodgy_count, utext
    # further action depends on how large dodgy_count / float(len(utext)) is

# checking for UTF-8 structure but non-compliant
# e.g. encoded surrogates, not minimal length, more than 4 bytes:
# Can be done with a regex, if you need it

एक बार आपने तय कर लिया कि यह न तो ASCII है और न ही UTF-8:

मोज़िला मूल के चारसेट डिटेक्टर जिन्हें मैं जानता हूं कि मैक्रोमन का समर्थन नहीं करते हैं और किसी भी मामले में विशेष रूप से अंग्रेजी के साथ 8-बिट वर्णमाला पर अच्छा काम नहीं करते हैं क्योंकि AFAICT वे जाँच पर निर्भर करते हैं कि क्या डिकोडिंग दिए गए अर्थों में समझ में आता है भाषा, विराम चिह्नों की अनदेखी, और उस भाषा में दस्तावेजों के विस्तृत चयन के आधार पर।

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

आपने उन फ़ाइलों का उल्लेख किया है जो ज्यादातर UTF-8 हैं लेकिन डिकोड करने में विफल हैं। आपको भी इस पर बहुत संदेह होना चाहिए:

(1) फाइलें जो कथित तौर पर ISO-8859-1 में इनकोड की गई हैं, लेकिन इसमें 0x80 से 0x9F समावेशी "कंट्रोल कैरेक्टर" शामिल हैं ... यह इतना प्रचलित है कि HTML5 मानक ड्राफ्ट को डिकोड करने के लिए कहता है सभी ISO-8859 के रूप में घोषित HTML -1 cp1252 का उपयोग कर।

(2) फाइलें जो UTF-8 के रूप में ठीक डिकोड करती हैं, लेकिन परिणामी यूनिकोड में U + 0080 से U + 009F समावेशी में "नियंत्रण वर्ण" शामिल हैं ... इसका परिणाम transcoding cp1252 / cp850 (ऐसा होता है!) / Etc देखा जा सकता है! "ISO-8859-1" से लेकर UTF-8 तक की फाइलें।

पृष्ठभूमि: मेरे पास गीले-संडे-दोपहर का प्रोजेक्ट है, जो पायथन-आधारित चार्टसेट डिटेक्टर बनाने के लिए है जो फ़ाइल-उन्मुख (वेब-उन्मुख) के बजाय है और 8 बिट वर्ण सेट के साथ अच्छी तरह से काम करता legacy ** nहै, जैसे cp850 और cp437। यह अभी तक प्राइम टाइम के पास नहीं है। मुझे प्रशिक्षण फ़ाइलों में दिलचस्पी है; क्या आपकी ISO-8859-1 / cp1252 / MacRoman फाइलें उतनी ही "बिना लाइसेंस वाली" हैं जितनी आपको किसी के कोड समाधान की उम्मीद है?


1
भाषा के आदेश देने का कारण पर्यावरण है। हमारे अधिकांश प्रमुख अनुप्रयोग जावा और लघु उपयोगिताओं में होते हैं और कुछ अनुप्रयोग पर्ल में हैं। हमारे यहां और यहां थोड़ा बहुत कोड है जो अजगर में है। मैं ज्यादातर सी और पर्ल प्रोग्रामर हूं, कम से कम पहली पसंद से, इसलिए मैं या तो हमारे ऐप लाइब्रेरी में प्लग करने के लिए जावा समाधान के लिए देख रहा था, या उसी के लिए एक पर्ल लाइब्रेरी। अगर सी, मैं एक बना सकता था XS गोंद परत इसे पर्ल इंटरफ़ेस से कनेक्ट करने के लिए, लेकिन मैंने पहले कभी अजगर में ऐसा नहीं किया है।
tchrist

3

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

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

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


1

यदि आप मैक्रोमैन के लिए हर एन्कोडिंग EXCEPT का पता लगा सकते हैं, तो यह मानना ​​तर्कसंगत होगा कि जिन लोगों को डिक्रिप्ट नहीं किया जा सकता है, वे मैक्रोमैन में हैं। दूसरे शब्दों में, बस उन फाइलों की एक सूची बनाएं जिन्हें संसाधित नहीं किया जा सकता है और उन्हें संभाल कर रखा जा सकता है जैसे कि वे मैक्रोमैन हों।

इन फ़ाइलों को सॉर्ट करने का दूसरा तरीका सर्वर आधारित प्रोग्राम बनाना होगा जो उपयोगकर्ताओं को यह तय करने की अनुमति देता है कि कौन सा एन्कोडिंग नहीं है। बेशक, यह कंपनी के भीतर होगा, लेकिन प्रत्येक दिन कुछ 100 कर्मचारियों के साथ, आपके पास कुछ समय में हजारों फाइलें होंगी।

अंत में, केवल सभी मौजूदा फ़ाइलों को एक ही प्रारूप में परिवर्तित करना बेहतर नहीं होगा, और इसके लिए आवश्यक है कि नई फाइलें उस प्रारूप में हों।


5
मजेदार! जब मैंने पहली बार इस टिप्पणी को 30 मिनट तक बाधित होने के बाद पढ़ा, तो मैंने "मैक्रोमैन" को "मैक्रो मैन" के रूप में पढ़ा और मैकरामन के साथ संबंध नहीं बनाया, जब तक कि मैं उस स्ट्रिंग की खोज नहीं देख पाऊं कि क्या ओपी ने इसका उल्लेख किया था
एड्रियन प्रैंक

+1 यह जवाब दिलचस्प है। यकीन नहीं है कि यह एक अच्छा या बुरा विचार है। क्या कोई मौजूदा एन्कोडिंग के बारे में सोच सकता है जो अनिर्धारित हो सकता है? क्या भविष्य में एक होने की संभावना है?
उपयोगकर्ता नाम

1

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

मैं वर्तमान में एक प्रोग्राम लिख रहा हूं जो XML में फ़ाइलों का अनुवाद करता है। इसमें प्रत्येक फ़ाइल के प्रकार को स्वचालित करना है, जो पाठ फ़ाइल के एन्कोडिंग को निर्धारित करने की समस्या का एक सुपरसेट है। एन्कोडिंग का निर्धारण करने के लिए मैं एक बायेसियन दृष्टिकोण का उपयोग कर रहा हूं। यही है, मेरा वर्गीकरण कोड एक संभावना (संभावना) की गणना करता है कि एक पाठ फ़ाइल में सभी एन्कोडिंग को समझने के लिए एक विशेष एन्कोडिंग है। प्रोग्राम तब सबसे संभावित डिकोडर का चयन करता है। बायेसियन दृष्टिकोण प्रत्येक एन्कोडिंग के लिए इस तरह काम करता है।

  1. प्रत्येक एन्कोडिंग की आवृत्तियों के आधार पर फ़ाइल को एन्कोडिंग में प्रारंभिक ( पूर्व ) संभावना सेट करें ।
  2. फ़ाइल में बारी-बारी से प्रत्येक बाइट की जाँच करें। बाइट मान वर्तमान में होने वाली बाइट मान और उस एन्कोडिंग में एक फ़ाइल के बीच संबंध को निर्धारित करने के लिए बाइट मान देखें। एक नई गणना करने के लिए उस सहसंबंध का उपयोग करें ( पीछे) ) संभावना की फ़ाइल एन्कोडिंग में है। यदि आपके पास जांच करने के लिए अधिक बाइट्स हैं, तो अगले बाइट की जांच करने पर उस बाइट की पूर्ववर्ती संभावना को पूर्व संभाव्यता के रूप में उपयोग करें।
  3. जब आप फ़ाइल के अंत में जाते हैं (मैं वास्तव में केवल पहले 1024 बाइट्स को देखता हूं), तो आपके पास जो संभावना है वह यह है कि फ़ाइल एन्कोडिंग में है।

यह पता चलता है कि Bayes के सिद्धांत का हो जाता है बहुत बजाय कंप्यूटिंग संभावनाओं का, आप की गणना करता है, तो ऐसा करने के लिए आसान जानकारी सामग्री , जिनमें से लघुगणक है बाधाओं : info = log(p / (1.0 - p))

आपके द्वारा मैन्युअल रूप से वर्गीकृत की गई फ़ाइलों के कॉर्पस की जांच करके आपको इनइटेल प्राथमिकता संभावना और सहसंबंधों की गणना करनी होगी।

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