requests
module、を使用してWebサービスから取得したユニコード文字列には、バイナリ文書(PCL)が含まれています。これらのバイトの一つは、値248を持ち、base64でエンコードしようと、それは次のようなエラーにつながる:PythonのUnicode文字列をBase64でエンコードするbase64 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'文字列のコードポイントをとりバイトとして扱うことです。コードポイントが0〜255の範囲内にあるという保証はないので、これは最高です。さらに悪いことは、それがカスタムで未定義のエンコーディングであるため、後でバイト文字列をどのように解釈するかを誰も知らないことです。 – Cameron