Tôi có một chuỗi unicode được lấy từ một webservice sử dụng requests
module, chứa các byte của tài liệu nhị phân (PCL, khi nó xảy ra). Một trong những byte có giá trị 248, và cố gắng base64 mã hóa nó dẫn đến các lỗi sau:base64 mã hóa các chuỗi unicode trong python 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)
Tôi tìm thấy điều này hơi ngạc nhiên, bởi vì 248 nằm trong phạm vi của một byte unsigned (và có thể được tổ chức tại một chuỗi byte), nhưng câu hỏi thực sự của tôi là: cách tốt nhất hoặc đúng để mã hóa chuỗi này là gì?
công việc xung quanh hiện tại của tôi là thế này:
In [74]: byte_string = ''.join(map(compose(chr, ord), response_dict['content']))
In [75]: byte_string[272]
Out[75]: '\xf8'
Điều này dường như làm việc một cách chính xác, và kết quả byte_string
có khả năng được mã hóa base64, nhưng có vẻ như không nên có một cách tốt hơn. Lanhung?
248 có thể nằm trong phạm vi byte chưa ký, nhưng không nằm trong phạm vi chuẩn ASCII [0-127]. – Cameron
@Cameron: Một điểm đúng và tốt, nhưng nó vẫn không giải thích được vấn đề, vì giá trị giống hệt nhau, khi được giữ trong một chuỗi byte không dẫn đến lỗi đó. – Marcin
Xem câu trả lời của tôi :-) Những gì bạn đã làm là lấy các điểm mã của chuỗi 'unicode' và coi chúng là byte. Điều này là ... cá tốt nhất, vì bạn không có đảm bảo codepoints ngay cả trong phạm vi 0-255. Thậm chí còn tệ hơn nữa là không ai khác sẽ biết cách giải thích chuỗi byte sau này, vì nó nằm trong một mã hóa tùy chỉnh, không xác định. – Cameron