Unicode 文字列のdecode
メソッドには、実際にはまったく用途がありません (何らかの理由で Unicode 文字列に非テキスト データが含まれている場合を除きます。以下を参照してください)。主に歴史的な理由からそこにあると思います。Python 3 では完全になくなりました。
unicode().decode()
デフォルト (ascii) コーデックを使用して暗黙のエンコードを実行します。s
これを次のように確認します。
>>> s = u'ö'
>>> s.decode()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 0:
ordinal not in range(128)
>>> s.encode('ascii')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 0:
ordinal not in range(128)
エラーメッセージはまったく同じです。
それは逆なので、デフォルトのエンコーディングを使用しての暗黙的なデコードをstr().encode()
試みます。s
>>> s = 'ö'
>>> s.decode('utf-8')
u'\xf6'
>>> s.encode()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0:
ordinal not in range(128)
このように使用するのstr().encode()
も余計です。
しかし、後者の方法の便利な別のアプリケーションがあります。文字セットとは関係なく、意味のある方法で 8 ビット文字列に適用できるエンコーディングがあります。
>>> s.encode('zip')
'x\x9c;\xbc\r\x00\x02>\x01z'
しかし、あなたの言うとおりです。これら両方のアプリケーションの「エンコード」のあいまいな使用法は... 厄介です。繰り返しますが、Python 3 の別のタイプbyte
とstring
タイプでは、これはもはや問題ではありません。