आपने एन्कोडिंग के साथ सामान्य समस्या पर ठोकर खाई है: मैं कैसे बता सकता हूं कि फ़ाइल को किस एन्कोडिंग में है?
उत्तर: आप तब तक नहीं कर सकते जब तक कि फ़ाइल प्रारूप इसके लिए उपलब्ध न कराए । XML, उदाहरण के लिए, के साथ शुरू होता है:
<?xml encoding="utf-8"?>
इस हेडर को सावधानीपूर्वक चुना गया था ताकि इसे एन्कोडिंग के बिना पढ़ा जा सके। आपके मामले में, ऐसा कोई संकेत नहीं है, इसलिए न तो आपके संपादक और न ही पायथन को कुछ पता नहीं है कि क्या चल रहा है। इसलिए, आपको codecs
मॉड्यूल का उपयोग करना चाहिए और उपयोग करना चाहिए codecs.open(path,mode,encoding)
जो पायथन में लापता बिट प्रदान करता है।
अपने संपादक के लिए, आपको यह देखना होगा कि क्या यह किसी फ़ाइल के एन्कोडिंग को सेट करने का कोई तरीका प्रदान करता है।
UTF-8 का बिंदु 8-बिट डेटा स्ट्रीम के रूप में 21-बिट वर्णों (यूनिकोड) को एन्कोड करने में सक्षम होना है (क्योंकि दुनिया में सभी कंप्यूटरों को केवल एक ही चीज़ हैंडल कर सकती है)। लेकिन चूंकि अधिकांश ओएस यूनिकोड युग से पहले हैं, इसलिए उनके पास हार्ड डिस्क पर फ़ाइलों को एन्कोडिंग जानकारी संलग्न करने के लिए उपयुक्त उपकरण नहीं हैं।
अगला मुद्दा पायथन में प्रतिनिधित्व है। यह पूरी तरह से heikogerlach द्वारा टिप्पणी में समझाया गया है । आपको यह समझना चाहिए कि आपका कंसोल केवल ASCII प्रदर्शित कर सकता है। यूनिकोड या कुछ भी दिखाने के लिए> = चारकोल 128, इसमें भागने के कुछ साधनों का उपयोग करना चाहिए। अपने संपादक में, आपको बची हुई डिस्प्ले स्ट्रिंग टाइप नहीं करनी चाहिए लेकिन स्ट्रिंग का क्या अर्थ है (इस मामले में, आपको umlaut दर्ज करना होगा और फ़ाइल को सहेजना होगा)।
उस ने कहा, आप एक बची हुई स्ट्रिंग को स्ट्रिंग में बदलने के लिए पायथन फंक्शन इवल () का उपयोग कर सकते हैं:
>>> x = eval("'Capit\\xc3\\xa1n\\n'")
>>> x
'Capit\xc3\xa1n\n'
>>> x[5]
'\xc3'
>>> len(x[5])
1
जैसा कि आप देख सकते हैं, स्ट्रिंग "\ xc3" को एकल वर्ण में बदल दिया गया है। यह अब 8-बिट स्ट्रिंग, UTF-8 एन्कोडेड है। यूनिकोड प्राप्त करने के लिए:
>>> x.decode('utf-8')
u'Capit\xe1n\n'
ग्रेग लिंड ने पूछा: मुझे लगता है कि यहां कुछ टुकड़े गायब हैं: फ़ाइल f2 में शामिल हैं: हेक्स:
0000000: 4361 7069 745c 7863 335c 7861 316e Capit\xc3\xa1n
codecs.open('f2','rb', 'utf-8')
, उदाहरण के लिए, उन सभी को एक अलग चार्ट (अपेक्षित) में पढ़ता है क्या एएससीआईआई में एक फाइल पर लिखने का कोई तरीका है जो काम करेगा?
उत्तर: इसका मतलब आप पर निर्भर करता है। ASCII वर्णों का प्रतिनिधित्व नहीं कर सकता> 127. तो आपको यह कहने के लिए किसी तरह की आवश्यकता है "अगले कुछ वर्णों का मतलब कुछ विशेष है" जो कि अनुक्रम "\ x" करता है। यह कहता है: अगले दो वर्ण एकल वर्ण के कोड हैं। "यू" यूनिकोड को 0xFFFF (65535) तक एनकोड करने के लिए चार वर्णों का उपयोग करता है।
इसलिए आप सीधे यूनिकोड को ASCII में नहीं लिख सकते हैं (क्योंकि ASCII में समान अक्षर नहीं हैं)। आप इसे स्ट्रिंग एस्केप (एफ 2 में) के रूप में लिख सकते हैं; इस स्थिति में, फ़ाइल को ASCII के रूप में दर्शाया जा सकता है। या आप इसे UTF-8 के रूप में लिख सकते हैं, इस स्थिति में, आपको 8-बिट सुरक्षित स्ट्रीम की आवश्यकता है।
आपके द्वारा उपयोग किया गया समाधान decode('string-escape')
काम करता है, लेकिन आपको पता होना चाहिए कि आप कितनी मेमोरी का उपयोग करते हैं: उपयोग करने की मात्रा का तीन गुना codecs.open()
।
याद रखें कि एक फाइल सिर्फ 8 बिट्स के साथ बाइट्स का एक क्रम है। न तो बिट्स और न ही बाइट्स का कोई अर्थ है। यह आप हैं जो कहते हैं "65 का अर्थ है 'ए'"। चूंकि \xc3\xa1
"आ" बन जाना चाहिए लेकिन कंप्यूटर के पास जानने का कोई साधन नहीं है, आपको इसे एन्कोडिंग को निर्दिष्ट करके बताना होगा जो फ़ाइल लिखते समय उपयोग किया गया था।