/ / Python2: त्रुटियों के साथ .decode का उपयोग करना = 'बदलें' अभी भी त्रुटी देता है - अजगर, अजगर-2.7, यूनिकोड, चरित्र-एन्कोडिंग

Python2: त्रुटियों के साथ. डीकोड का उपयोग करना = ' बदलें ' अभी भी रिटर्न त्रुटियाँ-अजगर, अजगर-२.७, यूनिकोड, चरित्र-एंकोडिंग

तो मेरे पास एक है message जिसे अज्ञात एन्कोडिंग की एक फ़ाइल से पढ़ा जाता है। मैं प्रदर्शन के लिए एक वेबपेज पर भेजना चाहता हूं। मैंने "यूनिकोडरर्स के साथ बहुत कुछ किया है और कई Q & As StackOverflow पर गुज़रा है और मुझे लगता है कि यूनिकोड और एन्कोडिंग कैसे काम करता है, इस बारे में मुझे अच्छी समझ है। मेरा वर्तमान कोड इस तरह दिखता है

try :
return message.decode(encoding="utf-8")
except:
try:
return message.decode(encoding="latin-1")
except:
try:
print("Unable to entirely decode in latin or utf-8, will replace error characters with "?"")
return message.decode(encoding="utf-8", errors="replace")

लौटाया गया संदेश फिर JSON में डंप कर सामने के छोर पर भेज दिया जाता है।

मुझे लगता है कि क्योंकि मैं का उपयोग कर रहा हूँ errors="replace"आखीर मे try except कि मैं कुछ होने की कीमत पर अपवादों से बचने जा रहा था? मेरे प्रदर्शन में पात्र। एक स्वीकार्य लागत।

हालाँकि, ऐसा लगता है कि मैं बहुत आशान्वित था, और कुछ फाइलों के लिए मुझे अभी भी ए UnicodeDecodeException "अस्सी कोडेक्स डिकोड नहीं कर सकता" कुछ चरित्र के लिए। क्यों नहीं करता "टी errors="replace" बस इस का ख्याल रखना?

(एक बोनस प्रश्न के रूप में, एएससीआई को इसमें से किसी के साथ क्या करना है? .. मैं "utf-8 निर्दिष्ट करता हूं)

उत्तर:

उत्तर № 1 के लिए 1

आपको ए नहीं मिलना चाहिए UnicodeDecodeError साथ में errors="replace"। भी str.decode("latin-1") कभी भी असफल नहीं होना चाहिए, क्योंकि ISO-8859-1 में हर संभव बाइट अनुक्रम के लिए एक वैध चरित्र मानचित्रण है।

मेरा संदेह यह है कि message पहले से ही एक है unicode स्ट्रिंग, बाइट्स नहीं। यूनिकोड पाठ को पहले ही बाइट्स से 'डीकोड' किया जा चुका है और इसे "और नहीं" डीकोड किया जा सकता है।

जब तुमने फोन किया .decode()unicode स्ट्रिंग, पायथन 2 मददगार बनने की कोशिश करता है और इसका फैसला करता है सांकेतिक शब्दों में बदलना यूनिकोड स्ट्रिंग बाइट्स (डिफ़ॉल्ट एन्कोडिंग का उपयोग करके), ताकि आपके पास कुछ ऐसा हो जिसे आप वास्तव में डिकोड कर सकें। यह अंतर्निहित एन्कोडिंग कदम है नहीं करता है "टी उपयोग errors="replace", इसलिए यदि यूनिकोड स्ट्रिंग में कोई भी वर्ण हैं जो "एन्कोडिंग डिफ़ॉल्ट टी (शायद ASCII) में हैं, तो आप" UnicodeEncodeError.

(पायथन 3 अब ऐसा नहीं करता क्योंकि यह बहुत भ्रामक है।

के प्रकार की जाँच करें message और यह मानते हुए कि यह वास्तव में है Unicode, वहाँ से वापस खोजने के लिए जहां यह डिकोड किया गया था (संभवतः अंतर्निहित) को सही डिकोडिंग के साथ बदलने के लिए।


जवाब के लिए 0 № 2

त्रुटि के साथ डिकोड "प्रतिस्थापन" त्रुटि हैंडलिंग को लागू करता है (के लिए) पाठ एन्कोडिंग केवल): विकल्प "?" एन्कोडिंग त्रुटियों के लिए (कोडेक द्वारा एन्कोड किया जाना), और डिकोडिंग त्रुटियों के लिए "ufffd" (यूनिकोड प्रतिस्थापन चरित्र)

टेक्स्ट एनकोडिंग का अर्थ है "कोडक जो यूनिकोड स्ट्रिंग्स को बाइट्स से जोड़ता है।"

हो सकता है कि आपका डेटा विकृत हो - यू की कोशिश करनी चाहिए "अनदेखा" त्रुटि से निपटने में जहां विकृत डेटा को अनदेखा किया जाता है और एन्कोडिंग या डिकोडिंग को बिना किसी नोटिस के जारी रखा जाता है।

message.decode(encoding="utf-8", errors="ignore")