1. ホーム
  2. python

[解決済み] Python 3 - エンコード/デコード vs Bytes/Str [重複].

2023-01-04 22:38:17

質問

私はpython2から来たpython3に新しいです、そして、私はunicodeの基礎で少し混乱しています。 私はいくつかの良い記事を読んで、すべてがはるかに明確になりましたが、私はエンコードとデコードを処理する2つのメソッドがpython 3にあるのを見て、私はどちらを使用するべきかわかりません。

Python 3でのアイデアは、すべての文字列はユニコードであり、エンコードしてバイトに格納したり、デコードして再びユニコード文字列に戻したりできることです。

しかし、それを行うには2つの方法があります。

u'something'.encode('utf-8')b'something' を生成しますが、同様に bytes(u'something', 'utf-8') .

そして b'bytes'.decode('utf-8') と同じことをするようです。 str(b'bytes', 'utf-8') .

今、私の質問は、同じことをするように見える2つの方法がなぜあるのか、そして、どちらかが他よりも優れているのか(そして、なぜか)です。

>>> original = '27岁少妇生孩子后变老'
>>> type(original)
<class 'str'>
>>> encoded = original.encode('utf-8')
>>> print(encoded)
b'27\xe5\xb2\x81\xe5\xb0\x91\xe5\xa6\x87\xe7\x94\x9f\xe5\xad\xa9\xe5\xad\x90\xe5\x90\x8e\xe5\x8f\x98\xe8\x80\x81'
>>> type(encoded)
<class 'bytes'>
>>> encoded2 = bytes(original, 'utf-8')
>>> print(encoded2)
b'27\xe5\xb2\x81\xe5\xb0\x91\xe5\xa6\x87\xe7\x94\x9f\xe5\xad\xa9\xe5\xad\x90\xe5\x90\x8e\xe5\x8f\x98\xe8\x80\x81'
>>> type(encoded2)
<class 'bytes'>
>>> print(encoded+encoded2)
b'27\xe5\xb2\x81\xe5\xb0\x91\xe5\xa6\x87\xe7\x94\x9f\xe5\xad\xa9\xe5\xad\x90\xe5\x90\x8e\xe5\x8f\x98\xe8\x80\x8127\xe5\xb2\x81\xe5\xb0\x91\xe5\xa6\x87\xe7\x94\x9f\xe5\xad\xa9\xe5\xad\x90\xe5\x90\x8e\xe5\x8f\x98\xe8\x80\x81'
>>> decoded = encoded.decode('utf-8')
>>> print(decoded)
27岁少妇生孩子后变老
>>> decoded2 = str(encoded2, 'utf-8')
>>> print(decoded2)
27岁少妇生孩子后变老
>>> type(decoded)
<class 'str'>
>>> type(decoded2)
<class 'str'>
>>> print(str(b'27\xe5\xb2\x81\xe5\xb0\x91\xe5\xa6\x87\xe7\x94\x9f\xe5\xad\xa9\xe5\xad\x90\xe5\x90\x8e\xe5\x8f\x98\xe8\x80\x81', 'utf-8'))
27岁少妇生孩子后变老
>>> print(b'27\xe5\xb2\x81\xe5\xb0\x91\xe5\xa6\x87\xe7\x94\x9f\xe5\xad\xa9\xe5\xad\x90\xe5\x90\x8e\xe5\x8f\x98\xe8\x80\x81'.decode('utf-8'))
27岁少妇生孩子后变老

どのように解決するのですか?

どちらが優れているということはなく、全く同じことをします。しかし .encode().decode() が一般的な方法です。Python2にも対応しています。