5

मेरे पास एक टेक्स्ट है जिसमें "\ xaf", "\ xbe" जैसे वर्ण हैं, जैसा कि मैं इसे this question से समझता हूं, ASCII एन्कोडेड वर्ण हैं।पायथन में xXY एन्कोडेड वर्णों को यूटीएफ -8 में कैसे परिवर्तित करें?

मैं उन्हें पायथन में उनके यूटीएफ -8 समकक्षों में परिवर्तित करना चाहता हूं। सामान्य string.encode("utf-8")UnicodeDecodeError फेंकता है। क्या कोई बेहतर तरीका है, उदाहरण के लिए, codecs मानक लाइब्रेरी के साथ?

नमूना 200 characters here

+0

आपका नमूना शामिल नहीं है किसी भी '\ xaf' या पसन्द। क्या आपके पास ऐसे पात्रों के साथ कोई नमूने हैं? – dkarp

+0

आपका नमूना डेटा * मान्य यूटीएफ -8 है। "रिकॉर्ड विभाजक" और "इकाई विभाजक" नियंत्रण वर्णों के साथ। – dan04

+0

'enca' (http://linux.die.net/man/1/enca) के अनुसार यह यूटीएफ -8 है" गैर-पाठ डेटा से घिरा हुआ/इंटरमीक्स "। –

उत्तर

2

आपकी फ़ाइल पहले से ही एक UTF-8 एन्कोडेड फ़ाइल है।

# saved encoding-sample to /tmp/encoding-sample 
import codecs 
fp= codecs.open("/tmp/encoding-sample", "r", "utf8") 
data= fp.read() 

import unicodedata as ud 

chars= sorted(set(data)) 
for char in chars: 
    try: 
     charname= ud.name(char) 
    except ValueError: 
     charname= "<unknown>" 
    sys.stdout.write("char U%04x %s\n" % (ord(char), charname)) 

और मैन्युअल रूप से अज्ञात नामों में भरने:
चार u000a लाइन फ़ीड
चार U001e जानकारी SEPARATOR दो
चार U001f जानकारी SEPARATOR एक

+0

धन्यवाद, आप सही हैं जो मैंने प्रदान किया है छोटा नमूना यूटीएफ -8 है। हालांकि (दुर्भाग्य से) पूरी फाइल में, कई अन्य एन्कोडिंग (ज्यादातर विंडोज़ -1250) में एन्कोड किए गए हिस्से हैं। मैंने इसे "स्ट्रिंग" करने की कोशिश करके हल किया है।सबसे आम एन्कोडिंग के लिए डीकोड() 'और, अगर सबकुछ विफल हो गया, तो 'chardet' लाइब्रेरी के साथ एन्कोडिंग का अनुमान लगाया गया। –

2

यह ASCII नहीं है (ASCII कोड केवल 127 तक जाते हैं; \xaf 175 है)। आपको सबसे पहले सही एन्कोडिंग का पता लगाने, डीकोड करने की आवश्यकता है, और उसके बाद यूटीएफ -8 में फिर से एन्कोड करना होगा।

क्या आप एक वास्तविक स्ट्रिंग नमूना प्रदान कर सकते हैं? तो हम शायद वर्तमान एन्कोडिंग अनुमान लगा सकते हैं।

+0

मैंने एक छोटे नमूने के लिए एक लिंक जोड़ने के लिए सवाल संपादित किया है। –

+0

वह नमूना मेरे लिए एक एन्कोडेड टेक्स्ट जैसा नहीं दिखता है, एक मालिकाना प्रारूप की तरह। –

+0

यह एमएआरसी प्रारूप (http://www.loc.gov/marc/) में होना चाहिए। जब मैंने 'एन्का' के साथ अपने एन्कोडिंग का पता लगाने की कोशिश की तो मुझे जवाब मिला कि यह ज्यादातर यूटीएफ -8 गैर-पाठ पात्रों के साथ छेड़छाड़ की गई है। –

3

.encode एक एक बाइट स्ट्रिंग (2.x में str, 3.x में bytes) के लिए एक यूनिकोड स्ट्रिंग (2.x में unicode, 3.x में str) परिवर्तित करने के लिए है।

2.x में, str ऑब्जेक्ट पर .encode पर कॉल करना कानूनी है। पायथन पूरी तरह से यूनिकोड को स्ट्रिंग को डीकोड करता है: s.encode(e) काम करता है जैसे आपने s.decode(sys.getdefaultencoding()).encode(e) लिखा था।

समस्या यह है कि डिफ़ॉल्ट एन्कोडिंग "ascii" है, और आपकी स्ट्रिंग में गैर-ASCII वर्ण हैं। आप सही एन्कोडिंग को स्पष्ट रूप से निर्दिष्ट करके इसे हल कर सकते हैं।

>>> '\xAF \xBE'.decode('ISO-8859-1').encode('UTF-8') 
'\xc2\xaf \xc2\xbe' 
+0

यह ठीक है लेकिन बाकी पाठ यूटीएफ -8 के रूप में एन्कोड किया गया है (कम से कम यह 'एन्का' द्वारा रिपोर्ट किया गया था)। तो इस प्रक्रिया को पूरे पाठ के लिए लागू नहीं किया जा सकता है। –

+2

तो \ xXY वर्ण आईएसओ -885 9 -1 में हैं? –