2010-03-24 13 views
7

मुझे एमएसएसएलएल में एक डेटाबेस मिला है जिसे मैं SQLite/Django पर पोर्ट कर रहा हूं। मैं डेटाबेस से कनेक्ट करने के लिए pymssql का उपयोग कर रहा हूं और स्थानीय SQLite डेटाबेस में एक टेक्स्ट फ़ील्ड को सहेज रहा हूं।"अवैध" यूनिकोड वर्णों को कनवर्ट या स्ट्रिप करें

हालांकि कुछ पात्रों के लिए, यह विस्फोट हो जाता है। मुझे इस तरह की शिकायतें मिलती हैं:

UnicodeDecodeError: 'ascii' codec can't decode byte 0x97 in position 1916: ordinal not in range(128) 

क्या कोई तरीका है कि मैं वर्णों को उचित यूनिकोड संस्करणों में परिवर्तित कर सकता हूं? या उन्हें बाहर पट्टी?

उत्तर

11

एक बार जब आप है बाइट्स s की स्ट्रिंग, इसे यूनिकोड ओबीजे के रूप में सीधे उपयोग करने के बजाय, इसे सही कोडेक के साथ स्पष्ट रूप से रूपांतरित करें, उदाहरण:

u = s.decode('latin-1') 

और इस बिंदु का पालन करने वाले कोड में के बजाय u का उपयोग करें (संभवतः वह भाग जो स्क्लाइट को लिखता है)। यह माना जाता है कि latin-1 एन्कोडिंग है जिसका उपयोग बाइट स्ट्रिंग को मूल रूप से बनाने के लिए किया गया था - हमारे अनुमान लगाने के लिए यह असंभव है, इसलिए पता लगाने का प्रयास करें ;-)।

एक सामान्य नियम के रूप में, मैं सुझाव: अपने अनुप्रयोगों में इनकोडिंग बाइट स्ट्रिंग के रूप में किसी भी पाठ की प्रक्रिया नहीं है -, सही इनपुट के बाद यूनिकोड वस्तुओं के लिए उन्हें डिकोड, और यदि आवश्यक हो सही उत्पादन से पहले उन्हें वापस सांकेतिक शब्दों में बदलना बाइट तार करने के लिए ।

+5

दरअसल, आपको पता होना चाहिए कि आपका टेक्स्ट एन्कोडिंग क्या है। इसके आसपास बहुत कुछ नहीं है। आपके मामले में, सौभाग्य से, आपका त्रुटि संदेश यह स्पष्ट करता है। 0x97 चरित्र की उपस्थिति के कारण, यह लगभग निश्चित शर्त है कि आप माइक्रोसॉफ्ट के कष्टप्रद सीपी 1252 से निपट रहे हैं। लैटिन -1 में, इस कोडपॉइंट में एक नियंत्रण चरित्र होता है, "गारंटीकृत क्षेत्र का अंत" जिसका लगभग कभी उपयोग नहीं किया जाता है। आपको utf-8 के साथ यह सटीक त्रुटि कभी नहीं दिखाई देगी क्योंकि 0x97 मान्य वर्ण-अग्रणी बाइट नहीं है। दूसरी तरफ, सीपी 1252 में, यह बहुत आम है। – jcdyer

11

जब आप को डिकोड, बस पारित 'उपेक्षा' उन अक्षरों

अलग करना के कुछ और तरह से परिवर्तित होते हैं/वहाँ पट्टी

'replace': replace malformed data with a suitable replacement marker, such as '?' or '\ufffd' 

'ignore': ignore malformed data and continue without further notice 

'backslashreplace': replace with backslashed escape sequences (for encoding only) 

टेस्ट

>>> "abcd\x97".decode("ascii") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'ascii' codec can't decode byte 0x97 in position 4: ordinal not in range(128) 
>>> 
>>> "abcd\x97".decode("ascii","ignore") 
u'abcd' 
+12

पायथन 'अनदेखा' होने पर भी त्रुटियों को फेंकता है। ऐसा लगता है कि डीकोड/एन्कोड का कोई संयोजन नहीं है जिसे मैं किसी बेकार यूटीएफ -8 अक्षरों को बाहर निकालने के लिए प्राप्त कर सकता हूं कि मैं थोड़ी सी चीज नहीं दे सका। – user1244215

संबंधित मुद्दे