2012-01-07 14 views
5

मैं एक वेब ऐप पर एक POST अनुरोध भेजने की कोशिश कर रहा हूं। मैं मशीनीकरण मॉड्यूल (खुद urlib2 का एक रैपर) का उपयोग कर रहा हूँ। वैसे भी, जब मैं एक POST अनुरोध भेजने का प्रयास करता हूं, तो मुझे UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position 0: ordinal not in range(128) मिलता है। मैं unicode(string), unicode(string, encoding="utf-8"), unicode(string).encode() डालने की कोशिश की आदि, कुछ भी काम किया - या तो ऊपर त्रुटि दी, या TypeError: decoding Unicode is not supportedपायथन में एक गैर-ASCII POST अनुरोध भेजें?

मैं अन्य अतः समान प्रश्नों के उत्तर को देखा, लेकिन कोई भी मदद की।

अग्रिम धन्यवाद!

संपादित: उदाहरण है कि एक त्रुटि पैदा करता है:

prda = "šđćč" #valid UTF-8 characters 
prda # typing in python shell 
'\xc5\xa1\xc4\x91\xc4\x87\xc4\x8d' 
print prda # in shell 
šđćč 
prda.encode("utf-8") #in shell 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position 0: ordinal not in range(128) 
unicode(prda) 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position 0: ordinal not in range(128) 
+0

यदि आप एक छोटा, आत्मनिर्भर उदाहरण दिखाते हैं तो त्रुटि उत्पन्न करता है, तो मैं मदद करूंगा। – ekhumoro

+0

@ekhumoro उदाहरण जोड़ा, उम्मीद है कि यह –

उत्तर

7

मैं तुम्हें अजगर 2. x उपयोग कर रहे हैं मान

को देखते हुए एक यूनिकोड वस्तु:

mystr = myUnicode.encode('utf-8') 

ध्यान दें कि आप स्पष्ट रूप से एन्कोडिंग निर्दिष्ट करने की आवश्यकता:

myUnicode = u'\u4f60\u597d' 

एनकोड यह utf-8 का उपयोग कर। डिफ़ॉल्ट रूप से यह (आमतौर पर) ascii का उपयोग करेगा।

+0

उत्तर के लिए धन्यवाद। यदि मेरे पास स्ट्रिंग वेरिएबल है (स्ट्रिंग के बजाए) तो मैं इसे यूनिकोड ऑब्जेक्ट में परिवर्तित करने के बारे में कैसे जाउंगा? स्ट्रिंग वेरिएबल असाइन किए जाने से पहले इसे 'यू' उपसर्ग जोड़ने के लिए कोड में गहरा दफनाया गया है। –

0

क्योंकि वे पहले से इनकोडिंग रहे हैं :) कुछ भी करता है, तो, आप की जरूरत करने के लिए डे यह -code एक यूनिकोड वस्तु पाने के लिए आप, unicode कॉल में अपने वर्ण रैप करने के लिए की जरूरत नहीं है:

>>> s = '\xc5\xa1\xc4\x91\xc4\x87\xc4\x8d' # your string 
>>> s.decode('utf-8') 
u'\u0161\u0111\u0107\u010d' 
>>> type(s.decode('utf-8')) 
<type 'unicode'> 

मुझे mechanize नहीं पता है, इसलिए मुझे नहीं पता कि यह सही तरीके से संभालता है या नहीं, मुझे डर है।

मैं एक नियमित urllib2 पोस्ट कॉल के साथ क्या होता है क्या, urlencode उपयोग करने के लिए होगा:

>>> from urllib import urlencode 
>>> postData = urlencode({'test': s }) # note I'm NOT decoding it 
>>> postData 
'test=%C5%A1%C4%91%C4%87%C4%8D' 
>>> urllib2.urlopen(url, postData) # etc etc etc 
1

अपने उदाहरण में, आप एक गैर यूनिकोड स्ट्रिंग शाब्दिक गैर- ASCII वर्ण युक्त है, जो में परिणाम का उपयोग prdaबाइट स्ट्रिंग बन रहा है।

इसे प्राप्त करने के लिए, पाइथन स्वचालित रूप से स्ट्रिंग को एन्कोड करने के लिए sys.stdin.encoding का उपयोग करता है। आपके मामले में, इसका मतलब है कि स्ट्रिंग को "utf-8" के रूप में एन्कोड किया जाता है।

>>> print prda.decode('utf-8') 
šđćč 

ध्यान दें कि, एक स्क्रिप्ट या मॉड्यूल में, आप अजगर पर भरोसा नहीं कर सकते स्वचालित रूप से एन्कोडिंग का अनुमान लगाना:

एक यूनिकोड वस्तु को prda बदलने के लिए, आप उचित एन्कोडिंग का उपयोग कर इसे डिकोड करने की जरूरत है - आप स्पष्ट रूप से फ़ाइल के शीर्ष पर एन्कोडिंग Delare करने के लिए, इस तरह की आवश्यकता होगी:

# -*- coding: utf-8 -*- 

जब भी आप अजगर 2 में यूनिकोड त्रुटियों का सामना करना है, यह बहुत बार क्योंकि आपके कोड है यूनिकोड तारों के साथ बाइट स्ट्रिंग मिश्रण। तो आपको type(string) का उपयोग करके त्रुटि की वजह से किस प्रकार की स्ट्रिंग उत्पन्न हो रही है, यह हमेशा जांचना चाहिए।

यदि स्ट्रिंग ऑब्जेक्ट <type 'str'> है, लेकिन आपको उचित एन्कोडिंग का उपयोग करके यूनिकोड, डीकोड की आवश्यकता है। यदि स्ट्रिंग ऑब्जेक्ट <type 'unicode'> है, लेकिन आपको बाइट्स की आवश्यकता है, उपयुक्त एन्कोडिंग का उपयोग करके एन्कोड करें।

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