काम में ऐसा लगता है कि कोई भी सप्ताह कभी भी कुछ एन्कोडिंग-संबंधित धारणा, आपदा या तबाही के बिना नहीं गुजरता है। समस्या आमतौर पर प्रोग्रामर से निकलती है, जो सोचते हैं कि वे एन्कोडिंग को निर्दिष्ट किए बिना "पाठ" फ़ाइल को मज़बूती से संसाधित कर सकते हैं। लेकिन आप नहीं कर सकते।
इसलिए यह कभी भी उन नामों से मना करने वाली फाइलों के लिए तय किया गया है जो अंत में *.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 फाइलें हैं। और ये विशेष रूप से एक समस्या है।
कुछ समय के लिए अब मैं प्रोग्रामेटिकली यह निर्धारित करने का तरीका ढूंढ रहा हूं कि कौन सा है
- ASCII
- ISO-8859-1
- CP1252
- MacRoman
- UTF-8
एक फ़ाइल में है, और मुझे एक प्रोग्राम या लाइब्रेरी नहीं मिला है जो उन तीन अलग-अलग 8-बिट एन्कोडिंग के बीच मज़बूती से अंतर कर सकता है। हमारे पास अकेले एक हजार से अधिक MacRoman फाइलें हैं, इसलिए हम जो भीसेट डिटेक्टर का उपयोग करते हैं, उन्हें उन लोगों को सूँघने में सक्षम होना चाहिए। कुछ भी नहीं जो मैंने देखा है वह चाल को प्रबंधित कर सकता है। मुझे ICU चारसेट डिटेक्टर लाइब्रेरी की बड़ी उम्मीदें थीं , लेकिन यह MacRoman को नहीं संभाल सकता। मैंने पर्ल और पायथन दोनों में समान काम करने के लिए मॉड्यूल को भी देखा है, लेकिन बार-बार यह हमेशा एक ही कहानी है: मैकरोमन का पता लगाने के लिए कोई समर्थन नहीं।
इसलिए मैं जो खोज रहा हूं वह एक मौजूदा पुस्तकालय या कार्यक्रम है जो मज़बूती से यह निर्धारित करता है कि उन पाँच एन्कोडिंग में से एक फ़ाइल किसमें है - और उससे अधिक अधिमानतः। विशेष रूप से इसे तीन 3-बिट एन्कोडिंग के बीच अंतर करना होगा जो मैंने उद्धृत किया है, विशेष रूप से मैकरोमन । फाइलें 99% से अधिक अंग्रेजी भाषा के पाठ हैं; अन्य भाषाओं में कुछ हैं, लेकिन कई नहीं हैं।
यदि यह लाइब्रेरी कोड है, तो हमारी भाषा प्राथमिकता इसके लिए पर्ल, सी, जावा या पायथन और उस क्रम में होना है। यदि यह सिर्फ एक कार्यक्रम है, तो हम वास्तव में परवाह नहीं करते हैं कि यह किस भाषा में है, जब तक यह पूर्ण स्रोत में आता है, यूनिक्स पर चलता है, और पूरी तरह से अनएन्कर्ड है।
क्या किसी और की इस समस्या का एक ज़िलिन विरासत पाठ फ़ाइलों को बेतरतीब ढंग से एन्कोड किया गया है? यदि हां, तो आपने इसे कैसे हल करने का प्रयास किया, और आप कितने सफल रहे? यह मेरे प्रश्न का सबसे महत्वपूर्ण पहलू है, लेकिन मुझे इस बात में भी दिलचस्पी है कि क्या आपको लगता है कि प्रोग्रामर को अपनी फ़ाइलों को नाम देने (या नाम बदलने) के लिए प्रोत्साहित करना है, जो कि उन फ़ाइलों को वास्तविक एन्कोडिंग के साथ हैं जो भविष्य में समस्या से बचने में हमारी मदद करेंगे। क्या किसी ने कभी इसे संस्थागत आधार पर लागू करने की कोशिश की है, और यदि ऐसा है, तो क्या वह सफल था या नहीं और क्यों?
और हां, मैं पूरी तरह से समझता हूं कि कोई समस्या की प्रकृति को देखते हुए निश्चित उत्तर की गारंटी क्यों नहीं दे सकता। यह विशेष रूप से छोटी फ़ाइलों के साथ होता है, जहां आपके पास जाने के लिए पर्याप्त डेटा नहीं है। सौभाग्य से, हमारी फाइलें शायद ही कभी छोटी होती हैं। यादृच्छिक README
फ़ाइल के अलावा , अधिकांश 50k से 250k के आकार की सीमा में हैं, और कई बड़े हैं। आकार में कुछ K से अधिक कुछ भी अंग्रेजी में होने की गारंटी है।
समस्या डोमेन बायोमेडिकल टेक्स्ट माइनिंग है, इसलिए हम कभी-कभी व्यापक और बेहद बड़े कॉर्पोरा से निपटते हैं, जैसे कि PubMedCentral के सभी ओपन एक्सेस रिस्पॉन्सरी। 5.7 गीगाबाइट पर एक बड़ी फ़ाइल बायोटेसोरस 6.0 है। यह फ़ाइल विशेष रूप से कष्टप्रद है क्योंकि यह लगभग सभी UTF-8 है। हालाँकि, कुछ संख्याबेकुल गए और इसमें कुछ पंक्तियाँ अटक गईं जो कि कुछ 8-बिट एन्कोडिंग में हैं- Microsoft CP1252, मेरा मानना है। इससे पहले कि आप उस पर यात्रा करें, इसमें काफी समय लगता है। :(