base64 кодирует строки юникода в python 2.7

У меня есть строка юникода, полученная из веб-сервиса с использованием модуля requests, , который содержит байты двоичного document (PCL, как это бывает). Один из этих байтов имеет значение 248, и попытка закодировать его в base64 приводит к следующей ошибке:

In [68]: base64.b64encode(response_dict['content']+'\n')
---------------------------------------------------------------------------
UnicodeEncodeError                        Traceback (most recent call last)
C:\...\ in ()
----> 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:\...\ in ()
----> 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 может быть закодирован в base64, но, похоже, должен быть лучший способ. Есть ли?

9
задан Marcin 10 March 2012 в 11:04
поделиться