में यूनिकोड तार एन्कोडिंग मैं एक यूनिकोड स्ट्रिंग का उपयोग एक वेब सेवा से लिया गया है requests
module, जो (, पीसीएल के रूप में यह होता है) एक बाइनरी दस्तावेज़ की बाइट का है। इन बाइट्स में से एक मूल्य 248 है, और बेस 64 करने का प्रयास कर सांकेतिक शब्दों में बदलना यह निम्न त्रुटि की ओर जाता है:बेस 64 अजगर 2.7
In [68]: base64.b64encode(response_dict['content']+'\n')
---------------------------------------------------------------------------
UnicodeEncodeError Traceback (most recent call last)
C:\...\<ipython-input-68-8c1f1913eb52> in <module>()
----> 1 base64.b64encode(response_dict['content']+'\n')
C:\Python27\Lib\base64.pyc in b64encode(s, altchars)
51 """
52 # Strip off the trailing newline
---> 53 encoded = binascii.b2a_base64(s)[:-1]
54 if altchars is not None:
55 return _translate(encoded, {'+': altchars[0], '/': altchars[1]})
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf8' in position 272: ordinal not in range(128)
In [69]: response_dict['content'].encode('base64')
---------------------------------------------------------------------------
UnicodeEncodeError Traceback (most recent call last)
C:\...\<ipython-input-69-7fd349f35f04> in <module>()
----> 1 response_dict['content'].encode('base64')
C:\...\base64_codec.pyc in base64_encode(input, errors)
22 """
23 assert errors == 'strict'
---> 24 output = base64.encodestring(input)
25 return (output, len(input))
26
C:\Python27\Lib\base64.pyc in encodestring(s)
313 for i in range(0, len(s), MAXBINSIZE):
314 chunk = s[i : i + MAXBINSIZE]
--> 315 pieces.append(binascii.b2a_base64(chunk))
316 return "".join(pieces)
317
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf8' in position 44: ordinal not in range(128)
मैं इस थोड़ा आश्चर्य की बात लगता है, क्योंकि 248 (एक अहस्ताक्षरित बाइट की सीमा के भीतर है और में आयोजित किया जा सकता है एक बाइट स्ट्रिंग), लेकिन मेरा असली सवाल है: इस स्ट्रिंग को एन्कोड करने का सबसे अच्छा या सही तरीका क्या है?
मेरे वर्तमान काम के आसपास यह है:
In [74]: byte_string = ''.join(map(compose(chr, ord), response_dict['content']))
In [75]: byte_string[272]
Out[75]: '\xf8'
यह सही ढंग से काम करने के लिए प्रकट होता है, और जिसके परिणामस्वरूप byte_string
की जा रही बेस 64 इनकोडिंग में सक्षम है, लेकिन ऐसा लगता है जैसे वहाँ एक बेहतर तरीका होना चाहिए। है?
248 एक हस्ताक्षरित बाइट की सीमा के भीतर हो सकता है, लेकिन यह मानकीकृत ASCII [0-127] की सीमा में नहीं है। – Cameron
@ कैमरॉन: एक सच्चा और अच्छा बिंदु, लेकिन यह अभी भी समस्या की व्याख्या नहीं करता है, क्योंकि बाइट स्ट्रिंग में होने पर सटीक समान मान उस त्रुटि का परिणाम नहीं देता है। – Marcin
मेरा उत्तर देखें :-) आपने जो किया है वह 'यूनिकोड' स्ट्रिंग के कोडपॉइंट्स लेता है और उन्हें बाइट्स के रूप में व्यवहार करता है। यह ... सबसे अच्छा है, क्योंकि आप की कोई गारंटी नहीं है कि कोडपॉइंट 0-255 की सीमा के भीतर भी हैं। इससे भी बदतर यह है कि किसी और को यह पता नहीं चलेगा कि बाइट स्ट्रिंग को बाद में कैसे समझना है, क्योंकि यह एक कस्टम, अपरिभाषित एन्कोडिंग में है। – Cameron