1. ホーム
  2. python

[解決済み] エンコード/デコードの違いは何ですか?

2022-04-28 21:20:21

質問

str/unicodeのdecodeとencodeの違いがよくわからないのですが、どうしたらいいですか?

私が知っているのは str().decode() は、ある文字エンコーディングを持つバイト列があるとき、そのエンコーディング名を指定するとユニコード文字列を返してくれるものです。

知っているのは unicode().encode() は、与えられたエンコーディング名に従って、Unicode 文字をバイト列に変換します。

しかし str().encode()unicode().decode() が対象です。どなたか解説していただけませんか?

EDIT

いくつかの回答では .encode は文字列に対して行うが、誰も .decode はユニコードに対応します。

解決方法は?

その decode メソッドは、実際には何の用途もありません (何らかの理由で unicode 文字列に非テキストデータが含まれている場合は別ですが -- 下記参照)。これは主に歴史的な理由で存在するのだと思います。Python 3では、それは完全になくなっています。

unicode().decode() を実行すると、暗黙のうちに エンコーディング s をデフォルト(ascii)コーデックで使用します。このように検証します。

>>> 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'

しかし、あなたの言う通り、これらのアプリケーションの両方で "encoding" が曖昧に使われているのは...不愉快です。もう一度、別々の bytestring の型は、Python 3では、もはや問題ではありません。