У меня есть строка юникода, полученная из webservice с использованием requests
module, , которая содержит байты двоичного документа (PCL, как это бывает). Один из этих байтов имеет значение 248, и попытки base64 кодирования это приводит к следующей ошибке:base64 кодировка строк unicode в 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)
Я нахожу это немного удивительно, потому что 248 находится в пределах диапазона без знака байта (и может быть проведена в строка байта), но мой реальный вопрос: Каков наилучший или правильный способ кодирования этой строки?
Моя текущая Обходной это:
In [74]: byte_string = ''.join(map(compose(chr, ord), response_dict['content']))
In [75]: byte_string[272]
Out[75]: '\xf8'
Это, как представляется, правильно работать, и в результате byte_string
может быть закодирована base64, но мне кажется, что там должно быть лучше. Здесь?
248 может находиться в пределах диапазона беззнакового байта, но он не находится в диапазоне стандартизованного ASCII [0-127]. – Cameron
@Cameron: истинный и хороший момент, но он все еще не объясняет проблему, поскольку точно такое же значение, когда оно хранится в байтовой строке, не приводит к этой ошибке. – Marcin
См. Мой ответ :-). Что вы сделали, это взять кодовые точки строки 'unicode' и рассматривать их как байты. Это ... fishy в лучшем случае, так как вы не гарантируете, что кодовые точки даже находятся в диапазоне 0-255. Что еще хуже, так это то, что никто больше не будет знать, как интерпретировать байтовую строку позже, так как она находится в пользовательской неопределенной кодировке. – Cameron