私はドキュメントからの例Python で Base64 エンコーディングを使用する方法:
>>> import base64
>>> encoded = base64.b64encode(b'data to be encoded')
>>> encoded
b'ZGF0YSB0byBiZSBlbmNvZGVk'
しかし、先頭を省略して通常の文字列をエンコードしようとするとb
、
>>> encoded = base64.b64encode('data to be encoded')
が表示されますTypeError
。Python の古いバージョンでは次のようになっていました。
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python32\lib\base64.py", line 56, in b64encode
raise TypeError("expected bytes, not %s" % s.__class__.__name__)
TypeError: expected bytes, not str
最近のバージョンでは次のようになります。
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.12/base64.py", line 58, in b64encode
encoded = binascii.b2a_base64(s, newline=False)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: a bytes-like object is required, not 'str'
なぜこのようなことが起こるのでしょうか?
ベストアンサー1
A-Z
base64 エンコーディングは 8 ビットのバイナリ バイト データを受け取り、、、、 *の文字のみを使用してエンコードするため、電子メールなど、8 ビットのデータをa-z
すべて保持しないチャネル経由で送信できます。0-9
+
/
したがって、8 ビット バイトの文字列が必要です。Python 3 では、構文を使用してこれを作成しますb''
。
を削除するとb
、文字列になります。文字列は Unicode 文字のシーケンスです。base64 は Unicode データをどう処理すればよいかわかりません。Unicode データは 8 ビットではありません。実際、ビットはありません。:-)
2番目の例では:
>>> encoded = base64.b64encode('data to be encoded')
すべての文字はASCII文字セットにきちんと収まるため、base64エンコードは実際にはあまり意味がありません。代わりに、次のようにしてASCIIに変換することができます。
>>> encoded = 'data to be encoded'.encode('ascii')
あるいはもっと簡単に言うと:
>>> encoded = b'data to be encoded'
この場合も同じことになります。
* ほとんどのbase64の種類では、=
末尾にパディングとして が含まれる場合があります。さらに、base64の種類によっては、 と 以外の文字が使用される場合があり+
ます/
。バリアント概要表概要についてはWikipediaをご覧ください。